Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
FormatException bei DGVComboCell
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 79

Themenstarter:

FormatException bei DGVComboCell

beantworten | zitieren | melden

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
Fehler
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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 16.183

beantworten | zitieren | melden

Bei einem DataGrid Binding muss ValueMember exakt der Cell-Value entsprechen.
private Nachricht | Beiträge des Benutzers
kstanger
myCSharp.de - Member



Dabei seit:
Beiträge: 79

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers