2008-12-17 7 views
13

Ich benutze derzeit Winforms Databinding, um ein Dateneditierformular zu verdrahten. Ich verwende das netTiers-Framework über CodeSmith, um meine Datenobjekte zu generieren. Bei Datenbankfeldern, die Nullen zulassen, werden Nullwerttypen erstellt. Ich habe herausgefunden, dass die Verwendung von Winforms-Databinding für die Steuerelemente nicht ordnungsgemäß an Nullable-Typen gebunden werden kann.Die beste Möglichkeit, ein Winforms-Steuerelement an einen NULL-fähigen Typ zu binden

Ich habe Online-Lösungen gesehen, die vorschlagen, dass Leute neue Textbox-Klassen erstellen, die die Nullable-Typen behandeln können, aber das könnte ein Problem sein, wenn ich die Textfelder in den bereits erstellten Formularen austausche.

Anfangs dachte ich, es wäre toll, eine Erweiterungsmethode zu verwenden. Grundsätzlich erstellen Sie eine Erweiterungseigenschaft für die Textbox-Klasse und binden Sie an diese. Von meiner eingeschränkten Erweiterungsmethode Erfahrung und ein bisschen online zu überprüfen, sieht es so aus, als könnten Sie keine Erweiterungseigenschaft machen. Soweit ich das beurteilen kann, muss die Bindung durch eine Eigenschaft erfolgen, da sie in der Lage sein muss, den Wert zu erhalten oder zu setzen, so dass eine Erweiterungsmethode nicht funktionieren würde.

Ich würde gerne eine saubere Möglichkeit finden, diese Formulare mit etwas wie Erweiterungsmethoden nachzurüsten, aber wenn ich neue Textbox und Kombinationsfeldsteuerelemente erstellen muss, was ich tun werde.

ist mein Projekt derzeit auf .Net 2.0 aufgrund der Anforderung begrenzt auf Windows 2000

Irgendwelche Vorschläge zu laufen?

Antwort

31

In den Kommentaren der über einem der Plakate referenzierten Artikel kommt mit einer einfachen Lösung auf.

Statt Bindung mit:

textBox1.DataBindings.Add("Text", myClass, "MyTextProperty"); 

Bind mit:

textBox1.DataBindings.Add("Text", myClass, "MyTextProperty", true, DataSourceUpdateMode.OnPropertyChanged, string.Empty); 
1

Ooh, fies ... Ich kann mir nur ein paar Wege vorstellen, um das zu erreichen, und keines von beiden ist das, was ich als Ideal bezeichnen würde.

  • Der erste ist ein Wrapper für Ihre Datenobjekt zu schreiben, die nullables enthält, die die nullables alle leere Strings umwandelt. Binden Sie an Ihr Wrapper-Objekt.

  • Die zweiten, um sicherzustellen, dass alle Werte in der Datenbank nicht null sind ... wieder, nicht ideal

  • Die dritt Sie bereits entschieden haben, in dieser Situation nicht tragbar ist, ist, dass Sie Erstellen Sie ein benutzerdefiniertes Objekt, das das Textfeld erweitert, um eine Eigenschaft hinzuzufügen, die an ein Nullable gebunden werden kann.

  • Der viertbeste Weg, den ich mir vorstellen kann, scheint nicht möglich zu sein. Erstellen Sie eine Erweiterungseigenschaft, mit der Sie alle Textboxobjekte erweitern und an diese binden können. Es scheint jedoch nicht, dass Erweiterungseigenschaften zu diesem Zeitpunkt möglich sind. Es scheint, als wäre dies eine Situation, in der diese Art von Feature im .NET-Framework besonders nützlich wäre.

5

Ich bin gerade über dieses Problem selbst gestolpert und es ist ein echter Kopfschmerz.

Die lustige Sache über die Bindung von Nullable-Typen ist, dass ein DataGridView sie ohne Probleme behandelt - es sind nur die Textfelder, die Probleme verursachen.

Es ist ziemlich ekelhaft - es scheint sogar zu verhindern, ein Formular zu schließen, wenn Sie einen leeren Wert in das Textfeld haben und es scheint, dass Sie nicht davon weg tabbieren können.

Also, es ist keine gute Antwort, aber mein Vorschlag ist es, zu Datagridviews für die Nullable-Typen in einem Formular zu bleiben.

Ein weiterer Vorschlag ist eine ‚Extenderanbieter‘ zu verwenden, wie hier vorgeschlagen, obwohl ich es nicht getestet haben noch:

EDIT: Jetzt haben Sie den Beispielcode auf dieser Seite heruntergeladen und es funktioniert hervorragend.

http://www.thejoyofcode.com/Databinding_and_Nullable_types_in_WinForms.NET.aspx

+0

der Link funktioniert nicht mehr. – AlexP11223