Ich habe die letzten beiden Tage damit zugebracht, eine eigentlich kleine Geschichte unter .NET 2.0 zu realisieren.
Folgendes Szenario:
Auf einer Form gibt es eine ComboBox. Diese ist an ein BusinessObject gebunden (z. B. eine Person). Genauer ist die ComboBox an die Eigenschaft Firma der Person gebunden. Da in diesem Fall die Eigenschaft Firma optional ist kann die Property den Wert null annhemen. Soweit so gut. Also das Binding der ComboBox mit folgenden Code realisiert:
Binding newBinding = new Binding("SelectedItem", colPersonen, "Firma");
this.cboFirma.Bindings.Add(newBinding);
Soweit so gut. Wenn eine Person angzeigt wird, dann erscheint auch die entsprechende Firma. Man kann sie ändern und alles ist gut. Dann kommt das Fatale: "null". Wenn man den Text der ComboBox leert und sie verlässt, dann erscheint der erste Eintrag der Auswahlliste und es wird nicht "null" in die Property geschrieben.
Das Problem findet sich unter anderem hier und hier. In den Newsgroups finden sich auf jeden Fall noch mehr Einträge zu dem Thema. Die angebotenen Lösungen waren aber alle nicht zufriedenstellend, da ich nicht vor hatte einen fiktiven leeren Eintrag in die Collection des DataSource aufzunehmen (Das hätte zuviel Umbauarbeiten nach sich gezogen).
Also fing ich an mit den Properties DBNullValue und NullValue der Binding-Klasse zu experimentieren. Allerdings funktionierte alles nicht. Es wurde immer der erste Eintrag wieder eingetragen. Auch nachdem ich explizit null in der gebundenen Property zurückgegeben habe funktionierte das Binding nicht.
Es war also kein Problem der ComboBox, sondern des Bindings an sich. Als ich diesen Eintrag in einem MSDN-Blog las fiel mir der entscheidende Hinweis in den Schoß (Etwas versteckt, aber was solls, in der Doku steht's ja auch nicht wirklich):
Note: TextBox will display the NullValue if following conditions are met:a) Value in the DataTable is either DBNull.Value, null or DataSourceNullValue (read more about this below) AND
b) Formatting is enabled.
Um es einfach zu machen hab ich den entscheidenen Hinweis gleich hervorgehoben! Nachdem ich den obigen Code um diese kleinen Zeilen ergänzt hatte
newBinding.FormattingEnabled = true;
newBinding.DBNullValue = null;
newBinding.NullValue = null;
funktionierte alles bestens. Hat ja nur knapp 16 Stunden gedauert und mich in dieser Zeit ziemlich frustriert...
Kommentare
Mi, 05.03.2008 20:37
Hatte genau das selbe Problem allerdings unter Compact Frame work, da hat deine methode nic ht funktioniert, leider. [...]
Mi, 17.10.2007 12:00
finger happy die hab ich noch gefunden ^^
Mo, 09.07.2007 12:01
Ich denke das funktioniert sch on. Schließlich ist Java keine Satzgliederungssprache, sonde rn in der Spracheinteilu [...]
Mo, 09.07.2007 08:15
Da ist man nach Ewigkeiten mal wieder hier und liest das! S ehr fette Sache Lars! Hoffe ntlich programmierst du [...]
Fr, 02.02.2007 11:47
man, lars leben muss echt lang weilig sein. es passiert nicht s mehr! wird zeit, dass er wie der nach HH zurück kommt [...]