Laden...

Wie kann ich eine Checkbox in Cell eines DataGridViews anzeigen?

Erstellt von Christel vor 3 Jahren Letzter Beitrag vor 3 Jahren 906 Views
C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 3 Jahren
Wie kann ich eine Checkbox in Cell eines DataGridViews anzeigen?

Hallöchen,
ich habe ein DataGridView erstellt, welches ich aus einer DataTable fülle. Abhängig vom Datentyp des Parameter-Objektes pro Row soll in der Spalte "Value" eine Checkbox erscheinen.


                SafetyParameterTable = new DataTable();
                SafetyParameterTable.Columns.Add("ID");
                SafetyParameterTable.Columns.Add("Name");
                SafetyParameterTable.Columns.Add("Group");
                SafetyParameterTable.Columns.Add("Value", typeof(Object));
                SafetyParameterTable.Columns.Add("Unit");
                SafetyParameterTable.Columns.Add("Comment");
                SafetyParameterTable.Columns.Add("Parameter", typeof(SafetyParameter));

                dgvSafetyParameter.DataSource = SafetyParameterTable;

                foreach (SafetyParameter param in SafetyParameterList)
                {
                    SafetyParameterTable.Rows.Add(new object[] { param.ID, param.Name, param.Group, null, param.Unit, param.Comment, param });
                }

                foreach (DataGridViewRow row in dgvSafetyParameter.Rows)
                {
                    SafetyParameter param = row.Cells["Parameter"].Value as SafetyParameter;

                    if (param != null)
                    {
                        if (param.DataType == typeof(Boolean))
                        {
                            DataGridViewCheckBoxCell checkBoxCell = new DataGridViewCheckBoxCell();
                            checkBoxCell.TrueValue = param.True;
                            checkBoxCell.FalseValue = param.False;
                            row.Cells["Value"] = checkBoxCell;

                            row.Cells["Value"].Value = param.Value;
                            dgvSafetyParameter.InvalidateCell(row.Cells["Value"]);
                        }
                    }
                }

Leider erscheinen in den entsprechenden Zellen keine Checkboxen.

Was mache ich falsch?

Danke
Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

5.657 Beiträge seit 2006
vor 3 Jahren

Hast du schon mal nach dem Problem gesucht? Bei mir ist das erste Ergebnis:Adding Different DataGridView Cell Types to a Column

Weeks of programming can save you hours of planning

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 3 Jahren

Ja, habe ich ausführlich. Und nein, ich habe keinen hilfreichen Beitrag gefunden.
Ich poste hier übrigens immer nur, nachdem ich vorher gesucht habe.

Gruß Christel

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

5.657 Beiträge seit 2006
vor 3 Jahren

Sehr gut 😃 Aber dann ist die Frage, was du anders machst als in den Beispielen.

Daß jemand hier so etwas schon einmal umgesetzt hat, ist ziemlich unwahrscheinlich. Da mußt du schon ein paar Zeilen zu deinem Problem und deiner Lösung schreiben, damit man das als Außenstehender nachvollziehen kann.

Weeks of programming can save you hours of planning

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 3 Jahren

Ich habe die Beispiele umgesetzt, die ich gefunden habe. Siehe mein Code Snippet. Das ist die angestreblte Lösung.

Das Problem ist, dass sich der Typ der Zellen nicht ändert. Mehr kann ich nicht beschreiben. Der Code lässt sich übersetzen und läuft und wirft keine Exception, aber ich bekomme keine Checkbox angezeigt.

Trotzdem danke. Ich werde wohl eine alternative Implementation wählen.

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

P
57 Beiträge seit 2017
vor 3 Jahren

Das alles kompiliert wird ist kein Garant dafür, dass es auch funktioniert 😃.

Hast du mal Breakpoints gesetzt und geschaut ob deine Abfrage


       if (param != null)
                    {
                        if (param.DataType == typeof(Boolean))
                        {
                            DataGridViewCheckBoxCell checkBoxCell = new DataGridViewCheckBoxCell();
                            checkBoxCell.TrueValue = param.True;
                            checkBoxCell.FalseValue = param.False;
                            row.Cells["Value"] = checkBoxCell;

                            row.Cells["Value"].Value = param.Value;
                            dgvSafetyParameter.InvalidateCell(row.Cells["Value"]);
                        }
                    }

durchläuft oder ob er die überspringt weil die Bedingung nicht erfüllt ist?

Denn ohne zu wissen ob dein "param" tatsächlich ein boolscher Wert ist, kann keiner sagen ob das ok ist oder nicht.

.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 3 Jahren

Ja natürlich habe ich debuggt und ja, die Bedingung wird erfüllt und der Code wird durchlaufen. Das einzige was fehlt, ist die Anzeige der Zelle als Checkbox.

Danke
Christel

PS: Ich finde es traurig, dass man hier neuerdings so behandelt wird, als wäre man blutiger Anfänger und würde unsinnige Fragen stellen, ohne vorher selber recherchiert und die nötigsten Schritte bei der Fehlersuche durchgeführt haben. Ich kenne es so nicht von hier, schreibe hier seit mittlerweile über 13 Jahren (und entwickle seit 32 Jahren Software) und habe bisher immer konstruktive Hilfe bekommen.
Schade.

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

16.806 Beiträge seit 2008
vor 3 Jahren

Das Problem ist ja, wie MrSparkle geschrieben hat, dass es sehr schwer ist mit den wenigen Details, die Du preisgibst, etwas als Außensteher anfangen bzw. die Sache nachvollziehen kann.
Dass dann die Leute Fragen nach einfachen Dingen stellen drückt damit also eher ein Interesse aus Dir zu helfen, statt Dich irgendwie als Anfänger hinzustellen.

Keiner hier antwortet, dass er Dich runtermachen kann.

W
955 Beiträge seit 2010
vor 3 Jahren

.. als workaround könnte man zwei Spalten machen eine Standard und eine für Checkboxen und dann die nicht benötigte unsichtbar machen (wenn das überhaupt geht)

C
Christel Themenstarter:in
448 Beiträge seit 2007
vor 3 Jahren

Die Zellen sollen in manchen Zeilen als Checkbox erscheinen, in anderen als Texzbox, zukünftig evtl. auch als Combobox. Die Lösung passt daher nicht. Aber trotzdem danke.

Es ist schlimm, eine Ausnahme zu sein, aber noch schlimmer, keine zu sein.

P
57 Beiträge seit 2017
vor 3 Jahren

Auch wenn das für dich jetzt ggf. nicht wirklich Konstruktiv ist - aber warum nutzt du nicht WPF?

Das ist in der Hinsicht deutlich einfacher zu handeln - bedeutet allerdings Einarbeitung und viel Durchhaltevermögen weil einiges auf Anhieb sehr gewöhnungsbedürftig ist.

Aber du bist deutlich flexibler......

.....an unhandled exception is the first way to think about your pattern of programming....
.....nur weil ich nicht weiß was dort passiert, bedeutet es nicht, dass ich nicht weiß, wie man es lösen kann - aber das ist wahrscheinlich....