Der Grund dafür, dass Sie das beobachtete Verhalten sehen, liegt darin, wie Windows Forms und seine Datenbindung NULL-Datenbankwerte verarbeiten.
Der TL;DR Grund:
Sehen Sie diese Microsoft Connect-Vorschlag: Provide better databinding support for nullable types
Die lange Version:
Was im Wesentlichen geschieht, ist, dass, wie Sie deaktivieren Sie das Textbox (auf einen leeren string) und anschließend Register entfernt, an die Datenquelle der Bindung Ihren leeren String in einen DBNull Wert umzuwandeln, die dann die Bindung jedoch vermehrt wird, da es zwei ist -way, versucht dann, das gebundene Steuerelement (das Textfeld) mit entsprechender Formatierung erneut zu füllen, und schlägt fehl, was dazu führt, dass das Textfeld das seltsame Verhalten anzeigt, dass der Fokus nicht entfernt werden darf!
Dies geschieht aufgrund der DataSourceNullValue Eigenschaft der Binding class. Dies kann unter Verwendung einer der Bindungsklassen Konstruktorüberladungen eingestellt werden, oder separat über eine Eigenschaftseinstellung jedoch festgelegt, wenn Sie nicht explizit diese Eigenschaft festgelegt, ist es wichtig zu beachten, dass:
Die Standardeinstellung ist DBNull für Werttypen und Null für Nicht-Wert-Typen.
Es scheint, dass Sie dies nicht explizit Einstellung sind, so dass der Standard bewirbt, und mit Datetime ein value type sein, es DBNull verwendet.
Sobald die Datenquelle (auf DBNull) aktualisiert worden ist, wird der Bindungsmechanismus versucht, dann mit dem neu aktualisierten Datenquellen-Wert die Textbox zu besiedeln. Wenn der zugrunde liegende Datenquellenwert DBNull ist, wird der für das gebundene Steuerelement verwendete Wert von NullValue property der Binding-Klasse bestimmt. Auch wenn diese Eigenschaft nicht explizit entweder über das entsprechende überladene Konstruktor Argument oder über die Eigenschaft Einstellung selbst, der Standardwert gilt, das ist gesetzt:
Das Objekt gesetzt werden als Steuer Eigenschaft, wenn die Datenquelle enthält einen DBNull-Wert. Der Standardwert ist null.
Natürlich kann ein Textbox's Text property nur auf ein Objekt vom Typ System.String und keinem Null-Wert (Nothing in VB) eingestellt werden, so dass die TextBox nicht den repräsentativen Wert (null/nichts) der Daten binden Quellwert (DBNull) für das gebundene Steuerelement.
Die Möglichkeit, dieses Verhalten zu korrigieren ist, um sicherzustellen, dass die Binding class's NullValue property explizit auf einen geeigneten Wert eingestellt ist. In diesem Fall reicht eine Zeichenfolge mit der Länge Null aus, um das Problem zu beheben.
Eine Möglichkeit, dies zu erreichen, ist die Linie zu ändern:
Me.txtRangeEnd.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.dvClientNos, "RangeEnd", True))
zu:
Me.txtRangeEnd.DataBindings.Add(New System.Windows.Forms.Binding("Text", Me.dvClientNos, "RangeEnd", True, DataSourceUpdateMode.OnValidation, ""))
Der Schlüssel hier ist der letzte Parameter, der die Nullvalue ist, auf einen null- length string (Die DataSourceUpdateMode wird auch explizit aufgrund der Argumente des Konstruktors angegeben, wird aber trotzdem auf den Standardwert gesetzt).
Trotz allem scheint es etwas "seltsames" Verhalten, wenn nicht ein tatsächlicher Fehler. Dies wird auch durch andere belegt, die das gleiche Problem zu haben scheinen (was in Visual Studio 2010/.NET 4.0 immer noch vorherrscht!). This thread auf den social.msdn.microsoft.com-Foren enthält jemanden, der das gleiche Problem mit einigen interessanten möglichen Erklärungen erfährt, warum dies geschieht, und warum Microsoft es so entworfen hat.
Es gibt auch eine , die im Jahr 2005 berichtet wurde, die das Problem hervorhebt. Dieser Vorschlag wurde "als verschoben abgelehnt". Es scheint, dass Microsoft es nicht als einen Fehler betrachtet, da eine sehr vernünftige Problemumgehung existiert (die explizite Einstellung der NullValue-Eigenschaft der Bindung), die aus Gründen der besseren Lesbarkeit sowieso getan werden sollte. Sie werden den Vorschlag in Zukunft offensichtlich berücksichtigen.
Zurück zu, warum dies nicht existierte pre.NET 2.0 (Visual Studio 2005) scheint aufgrund der Tatsache zu sein, dass der gesamte Datenbindungsmechanismus für die Veröffentlichung von .NET Framework 2.0 vollständig überarbeitet wurde. Ihre ursprüngliche Lösung, bei der es sich um ein VS2003-Projekt handelte, verwendete .NET Framework 1.1, das nicht über ein so umfangreiches Datenbindungs-Feature-Set verfügte. Obwohl ich keine Kopie von VS2003 mehr zur Hand habe, um das zu testen, nehme ich an, dass der Bindungsmechanismus in .NET 1.1 viel mehr implizite Konvertierungen zwischen dem Wert des Steuerelements und dem Wert der Datenquelle verwendet. Diese wird unterstützt, wenn Sie die Binding-Klasse von .NET 1.1, verglichen mit .NET 2.0 (oder höher) unterstützt werden. Zum Beispiel gab es keine Möglichkeit, die tatsächliche Zweiwege-Bindung selbst (und wie Werte zwischen dem Formular und der Datenquelle konvertiert werden) oder die Formatierung dieser Werte (einfach) zu steuern.
Diese kleine FormatBoxToDate-Methode wurde tatsächlich erstellt, da .NET 2003 keine andere Möglichkeit hatte, dies zu tun. Die NULL-Wert-Eigenschaft ist jetzt über das Menü Erweiterte Datenbanken verfügbar. Wenn Sie jedoch versuchen, dies über die IDE auf eine leere Zeichenfolge zu setzen, wird der Wert im Code auf Nothing gesetzt, was keinen Unterschied macht. – MartW
Ich habe es stattdessen manuell zu String.Empty gehackt (nie gemocht "") und es funktioniert jetzt. Ich nenne das gut verdiente Bounty: D – MartW
Sehr alt, aber sehr nützlich, da es immer noch in VS2013 gilt! aber Nebenfrage: die Linie zu ändern, arbeitete großartig für mich .. aber ich habe alles andere in den Designer-Eigenschaften gepflegt .. wenn ich es richtig verstehe, ist es eine Frage des Hinzufügens der Null-Wert im Folgenden unter den Textfeld Eigenschaften -> (Datenbindungen) -> (Erweitert) -> wähle die Texteigenschaft, wähle ein Datumsformat (in meinem Fall) und fülle dann den Nullwert aus. Ein leerer String scheint dort jedoch nicht zu funktionieren. irgendwelche Tipps, wie man es im Designer macht? –