Empty Datagridview-Zelle mit gebundenem Datenpfad

8

Ich habe eine DataGridView mit Spalten "Typ" und "Wert". Der Benutzer wählt einen Datentyp aus und gibt dann einen Wert ein, der mit diesem Typ kompatibel ist, wobei einige Typen (z. B. "Text") eine beliebige Zeichenfolge akzeptieren. Andere Typen (z. B. "Ja / Nein") sind auf eine Liste möglicher Werte beschränkt. Für jede Zeile habe ich die Zelle in der Spalte "Wert" als Textfeld für Freiformtypen oder als Kombinationsfeld für Listentypen festgelegt. Das DataGridView ist an eine DataTable gebunden.

Das Problem tritt auf, wenn der Benutzer einen Wert für einen Typ eingibt, dann aber die Zeile in einen anderen Typ umschaltet, für den der aktuelle Wert nicht zulässig ist. Egal, was ich versuche, kann ich die Zelle Wert nicht löschen. Wenn ich dann der Zelle eine Combobox zuweise, erhalte ich einen DataError, weil der aktuelle Wert der Zelle inkompatibel ist. Wie kann ich den Wert löschen, bevor die Zelle von einer Textbox in eine Combobox geändert wird?

%Vor%

Im Formularkonstruktor (dgvInputs ist das DataGridView):

%Vor%

Und Ereignisse:

%Vor%

Wenn Sie es auf "Text" setzen und etwas willkürliches eingeben, dann wechseln Sie zu "YesNo", es gibt einen Fehler "System.ArgumentException: DataGridViewComboBoxCell Wert ist nicht gültig.", die wieder erscheinen wird, sobald der Cursor vorbei ist die Zelle. Durch das Zurücksetzen in eine Textzeile wird der ursprüngliche Wert wieder angezeigt.

Ich gehe davon aus, dass das Problem darin besteht, dass der Wert in ParameterTable gespeichert wird, aber ich kann nicht erreichen, dass er mein Clearing des ursprünglichen Werts an ParameterTable weitergibt. Ich habe null und DBNull.Value anstelle von string.Empty ausprobiert, aber keiner hat einen Unterschied gemacht. Ich fügte die "CommitEdit" -Linie hinzu, in der Hoffnung, dass sie die Änderung vornehmen würde, aber das machte auch keinen Unterschied.

Bearbeiten: Wie sich herausstellte, war das Problem dieser Code, den ich in dem Zelländerungsereignis hatte:

%Vor%

Die Idee war es, den Wert möglichst zu erhalten, und ich hatte die Messagebox, um mir die spezifische Ausnahme zu zeigen, die ich zu fangen brauchte, da ich mir nicht sicher war. Aber anscheinend löst diese Zuordnung nicht sofort die Ausnahme aus. Das passiert erst später, anscheinend während eines anderen Ereignisses, mit dem ich nicht fertig bin.

Es ist im Nachhinein offensichtlich, dass ich diesen Code in die Stichprobe aufgenommen haben sollte. Ich habe keine Ahnung, wie ich es übersehen habe. Ich entschuldige mich bei allen, die ich auf eine wilde Jagd geführt habe, indem ich die kritischen Informationen weggelassen habe. Ich schätze all Ihre Hilfe.

    
Paul Sinclair 08.12.2015, 17:00
quelle

2 Antworten

1

Ihr Problem besteht nicht darin, den Wert zu löschen, sondern mit der YesNoList.

Die Grid-Compbobox versucht, den Wert für den aktuellen Datensatz zu finden, und in Ihrer YesNoList gibt es keinen Leerwert oder Nullwert.

Sie erhalten sogar einen Fehler, wenn Sie versuchen, einen neuen Datensatz hinzuzufügen und zuerst den Datentyp festzulegen, ohne den Wert festzulegen.

Sie können dies lösen, indem Sie entweder ein leeres Element zu Ihrer YesNoList hinzufügen oder indem Sie beim Wechseln von DataType einen Standardwert für den vorhandenen Datensatz festlegen.

    
Michael Kanios 15.12.2015 15:10
quelle
0

Bearbeiten: Ich weiß, unten beantwortet nicht speziell Ihre Frage, wie es heißt, aber das Beispiel kann Ihnen helfen. Erwägen Sie, zwei Controller in einer Zelle zu haben.

Original

Ich bin mir nicht sicher, ob dir das helfen wird oder nicht, aber ich habe versucht, ein sehr einfaches Programm zu machen, das du besprochen hast. Ein Datensatz wird mit 2 Einträgen erstellt. Die erste Spalte ist der DataType, die zweite ist Value. Wenn der DataType-Text ausgewählt ist, wird die Zelle Wert in ein Textfeld umgewandelt. Wenn der Datentyp Ja / Nein ausgewählt ist, wird die Textbox ausgeblendet und eine DropDownList angezeigt. Die Idee ist, eine Komponente auszublenden, wenn sie nicht benötigt wird.

Default.aspx.cs

%Vor%

Und die Default.aspx Seite

%Vor%

Dies ist das Beste, was ich im Moment tun kann, ohne mehr Code zu sehen, aber vielleicht können Sie ihn benutzen. Ein Vorschlag, dgvInputs_CurrentCellDirtyStateChanged, scheint Code zu committen. Ich gehe davon aus, dass dies SQL-Code ist. Vielleicht möchten Sie warten, bis Sie eine abschließende Schaltfläche "Submit" oder "Accept Changes" gedrückt haben, so dass Sie SQL nicht mehr so ​​oft aufrufen müssen, sondern auch, wenn zwischen dem Start des erster SQL-Aufruf und der letzte. Wenn eine Unterbrechung zwischen den beiden auftritt, möchten Sie möglicherweise nicht unbedingt festschreiben.

    
Esaith 16.12.2015 08:00
quelle

Tags und Links