Laden...

Datagridview - Buttons und Checkboxen in der selben Spalte

Letzter Beitrag vor 10 Jahren 4 Posts 3.503 Views
Datagridview - Buttons und Checkboxen in der selben Spalte

Hallo zusammen,

für ein Projekt bin ich gerade dabei, ein Datagridview zu erstelellen, in dem der Anwender Rückmeldungen zu verschiedenen Aufgaben geben muss. Dabei steht jede Aufgabe in einer Zeile.

Jetzt möchte ich in der Spalte rechts daneben verschiedene Controls einfügen:

  • Wenn Aufgabe erledigt werden muss, soll eine Checkbox eingefügt werden.
  • Wenn etwas anderes ausgeführt werden soll, soll ein Button eingefügt werden.
  • Vielleicht brauch ich noch Radio-Buttons, aber denke eher nicht.

Die Buttons in Form einer DataGridViewButtonCell einzufügen hab ich hinbekommen.
Wenn ich in der selben Spalte aber auch eine DataGridViewCheckBoxCell einfügen möchte, bekomme ich nach Aufbau des Grids folgenden Fehler:

Fehlermeldung:
DataGridView-Ausnahme:
System.FormatException: Der formatierte Wert der Zelle hat einen falschen Typ.

Schuld daran ist das Zellformat der Spalte.

Hier mein Code, den ich für´s testen verwende:


            DataTable DataTableChecks = new DataTable();
            DataGridView DataGridViewOutput = new DataGridView();
            DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();

            //Formatiert alle Spalten als TextboxCell
            //DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
            DataGridViewOutput = PrepareOuputDGV(DataGridViewOutput);
            DataTableChecks = DSCheckPrograms.Tables[test.Tag.ToString()];
            //Alle Zeilen durchlaufen
            foreach (DataRow row in DataTableChecks.Rows)
            {
                //Checkbox
                if (string.Compare(row["Istwert_Erfassung_DyBe"].ToString(), "ja", true) == 0)   
                {
                    CheckBox chkbox = new CheckBox();
                    chkbox.Visible = true;
                    DataGridViewOutput.Rows.Add(row["Puefung_Name_de"], row["Pruefung_Text_de"], false);
                    DataGridViewCheckBoxCell checkboxcell = new DataGridViewCheckBoxCell();
                    DataGridViewOutput.Columns[2].DefaultCellStyle.Format = "YesNo"; //Formatierung umstellen
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[2].Value = false;
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[2] = checkboxcell; //Erzeugt Fehler!!
                }
                //Numerisch --> Button Plus und Button Minus
                else if (IsNumeric(row["Istwert_Erfassung_DyBe"].ToString()) == true)             
                {
                    DataGridViewButtonCell buttonCell = new DataGridViewButtonCell();
                    DataGridViewButtonCell buttonCell1 = new DataGridViewButtonCell();
                    buttonCell.Value = "+";
                    buttonCell1.Value = "-";
                    DataGridViewOutput.Rows.Add(row["Puefung_Name_de"], row["Pruefung_Text_de"]); 
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[2] = buttonCell;
                    DataGridViewOutput.Rows[DataGridViewOutput.Rows.Count - 2].Cells[3] = buttonCell1;
                }
                else
                {
                    DataGridViewOutput.Columns[2].CellTemplate = cell;
                    DataGridViewOutput.Rows.Add(row["Puefung_Name_de"], row["Pruefung_Text_de"]); //Für Textfeld-Rückmeldung
                }
               
            }
                }

Kann man in einer Spalte verschiedene Controls (oder auch keine) implementieren?
Wenn ja, was mach ich falsch?

Vielen Dank schonmal.

Grüße Adleano

Hallo,

soweit ich weiß kann man pro Spalte immer nur genau einen Datentyp (bzw. Control) verwenden, jedoch könntest du ein UserControl erstellen und jeweils die nicht benötigten Controls je Zelle ausblenden. Als Anregung schau mal in Multiple controls in a single DataGridView cell

besten Dank für den Link.
Die Implementierung hat soweit schon mal sehr gut funktioniert und ich denke, dass ich das soweit auch kapiert hab 🙂

Im Prinzip läuft das ja dann so, dass ich ein Custom-Control habe, dass ich dann an die jeweilige Spalte hänge. Dieses Control implementiert dann alles was ich benötige:

  • Button-Cell
    -Textbox-Cell
  • Combobox-Cell
  • usw.

An was ich jetzt noch hänge ist, wie ich diese ganzen Controls miteinander "verheirate", sodass ich nachher ein Template mit allen jeweils benötigten "Sub-Controls" erhalte. Ich brauch ja je Zelle immer nur eines der Controls...

Hat hier noch jemand einen Tipp?

Besten Dank.

Wie schon geschrieben, müßtest du anhand eines Flags selber dafür sorgen, daß im Edit-Mode nur das zur aktuellen Zeile passende Sub-Control angezeigt wird (und dasselbe dann für das Zeichnen im CellPainting-Ereignis).