Laden...

FormatException bei DGVComboCell

Erstellt von kstanger vor einem Jahr Letzter Beitrag vor einem Jahr 665 Views
K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr
FormatException bei DGVComboCell

Hallo,

Ich will eine im DataGridView eine ComboBox zeilenweise in Abhängigkeit von Werten in einer anderen Spalte füllen. Dazu habe ich bei Form_Load die Liste von Objekten eingelesen und die BindingSource festgelegt.


           Timings = inOut.ReadTiming(Timings, Presettings);
            BindingSourceTiming.DataSource = Timings;
...
            DataGridViewTiming.Columns[2].Name = "Nummer";
            DataGridViewTiming.Columns[3].Name = "NumBesch";
...
            DataGridViewTiming.DataBindingComplete += new DataGridViewBindingCompleteEventHandler(DataGridViewTiming_DataBindingComplete);

Im Designer habe ich die Columns 2 und 3 als DataGridViewComboBoxColumn festgelegt.
Schließlich rufe ich das DataBindingComplete-Event auf, wo ich die ComboBoxen zeilenweise befülle. Damit überschreibe ich die Einstellung der Column 3.


        private void DataGridViewTiming_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
        {
            for (int loop = 0; loop < Timings.Count; loop++)
            {
                DataGridViewComboBoxCell cbCell = (DataGridViewComboBoxCell)DataGridViewTiming.Rows[loop].Cells["NumBesch"];
                if (Timings[loop].Typ == Lichtquelle.Relais)
                {
                    Timings[loop].Nummer = Relaises[Timings[loop].Nummer].RelaisNummer;
                    Timings[loop].NumBesch = Relaises[Timings[loop].Nummer].RelaisNumBesch;
                    if (cbCell != null)
                    {
                        cbCell.DataSource = BindingSourceRelais;
                        cbCell.DisplayMember = "RelaisNumBesch";
                        cbCell.ValueMember = "RelaisNummer";
                    }
                }
                else
                {
                    Timings[loop].Nummer = Leds[Timings[loop].Nummer].LedNummer;
                    Timings[loop].NumBesch = Leds[Timings[loop].Nummer].LedNumBesch;
                    if (cbCell != null)
                    {
                        cbCell.DataSource = BindingSourceLed;
                        cbCell.DisplayMember = "LedNumBesch";
                        cbCell.ValueMember = "LedNummer";
                    }
                }
            }
        }

Ich erhalte dann den Fehler> Fehlermeldung:

System.FormatException: Der DataGridViewComboBoxCell-Wert ist ungültig.

Wenn ich dann das DataError-Ereignis bediene, und zwar mit einer leeren Methode


        private void DataGridViewTiming_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
        }

erhalte ich das gewünschte Ergebnis, d.h. mein DGV ist so gefüllt wie ich es möchte.
Trotzdem muss es einen Fehler bei der ComboBoxCell geben. Kann mir da jemand helfen?

Karl Stanger
16.827 Beiträge seit 2008
vor einem Jahr

Bei einem DataGrid Binding muss ValueMember exakt der Cell-Value entsprechen.

K
kstanger Themenstarter:in
99 Beiträge seit 2022
vor einem Jahr

Ich habe gelesen, dass ein DataError auftritt, wenn z.B. Daten von einem Speicher geladen werden und dabei ein Fehler entsteht. Entweder muss dann der Zellenwert korrigiert werden oder die Formatierung muss geändert werden.
Da ja alles richtig angezeigt wird, schließe ich einen Datenfehler aus und vermute einen Formatierungsfehler. Ich habe bisher keinen Formatfehler gefunden und nun folgenden Code geschrieben:


        private void DataGridViewTiming_DataError(object sender, DataGridViewDataErrorEventArgs e)
        {
            if (e.Exception.Message == "Der DataGridViewComboBoxCell-Wert ist ungültig.")
            {
                object value = DataGridViewTiming.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
                if (!((DataGridViewComboBoxColumn)DataGridViewTiming.Columns[e.ColumnIndex]).Items.Contains(value))
                {
                    ((DataGridViewComboBoxColumn)DataGridViewTiming.Columns[e.ColumnIndex]).Items.Add(value);
                }
            }
        }

Wirklich zufrieden bin ich damit aber nicht.
Hat jemand eine Idee, wo und wie ich suchen könnte?

Karl Stanger