Bösartige "Ungültige DataGridViewComboBoxCell" in vb.net und c #

Hallo allerseits, Programmierfenster für MS VS.



Problem



1. Es gibt eine DataGridView. Eine der Spalten ist DataGridViewComboBoxColumn.

2. Daten werden wie eine DataTable über die DataSource in das Raster geworfen (nicht zeilenweise, dies ist wichtig).

3. Die Daten in der ComboBoxColumn sind ebenfalls gebunden, die Datenquelle hat ein gefülltes DataMember, zeilenweise oder nicht - es spielt keine Rolle, die spezifische Datenstruktur ist ebenfalls nicht wichtig, das darin enthaltene ValueMember ist Integer, Long oder sogar String.



Wenn Sie etwas aus der Dropdown-Liste auswählen, wird bei dgv_DataError der folgende Fehler angezeigt: "Ungültiger DataGridViewComboBoxCell-Wert". Und beim Füllen - sie.



Suche



Google hat nur zweieinhalb Seiten Foren herausgegeben. Dies bedeutet, dass das Problem weit verbreitet ist, aber nicht auf mittlerer Ebene gelöst werden kann. Falsche Richtungen der Gedankenentwicklung:

a) Gehen Sie nach dem Binden der Daten durch jede Zeile und verwenden Sie die Ziehpunkte, um den Wert in der Zelle neu zuzuweisen und ihn in der Liste zu finden.

b) Legen Sie die Behandlung von dgv_DataError auf.



Gleichzeitig ist alles in Ordnung, wenn die Zeilen in der Tabelle manuell über Rows.Add () ausgefüllt werden.



Meine Kollegen haben leider versucht herauszufinden, was mit der Liste nicht stimmte, aber das Problem lag nicht darin, sondern in der Typinkongruenz.



In der Vergangenheit verwendet MS SQL Dezimalstellen für eine Spalte mit aktivierter Identität. Ja, es ist eine Dezimalzahl (18,0), aber es bleibt immer noch ein gebrochener Datentyp. Ich stimme zu, es ist immer bequem, die Dezimalstelle des Index zu sehen. Wenn ich bis zu einer Million Datensätze pro Jahr erwarte, reicht eine Dezimalzahl (7,0) für 10 Jahre und eine Dezimalzahl (10,0) für 10000 aus. Nehmen wir an, die Sonne explodiert in 5 Milliarden Jahren - zählen wir die Ziffern: 6 + 9, das heißt Dezimal (15.0) ist genug und die Standardeinstellung 18 - mit einem Rand.



Und in der Liste haben wir Integer, Long oder sogar String!



Wir füllen die Linien mit Stiften, der Eisenblockkopf transformiert implizit alles, was für uns gebrochen und nicht gebrochen ist. Langsam und zuverlässig. Wir wollen es schnell, aber die Einsparungen werden erzielt, einschließlich des Fehlens unnötiger Überprüfungen von Typen und Transformationen.



Als Ergebnis treten zwei Probleme auf:

1. Beim Laden von Daten in eine Tabelle werden anstelle von Überschriftennamen aus der Liste die IDs aus der Datenbank in der Spalte angezeigt.

2. Wenn Sie einen Headernamen aus der Dropdown-Liste auswählen, wird der Wert in der Zelle nicht aktualisiert.



Entscheidung



Wenn die Datenbank für den Schnittstellenentwickler sehr, sehr groß, alt oder nicht verfügbar ist, verwenden Sie Dezimalindizes in der Combobox.



Wenn es einfacher ist, die Struktur von Tabellen in der Datenbank zu ändern, ist die Verwendung von bigint für Fremdschlüssel gut, sie ist fast ein ganzes Bit größer als die Dezimalzahl (18,0) und schneller.



All Articles