Wie verwende ich die Datenbindung mit Windows Forms-Optionsfeldern?

8

Ich habe ein Binärfeld in meiner Datenbank, das auf einer Benutzeroberfläche nur schwer mit einem einzigen "Is XXXX?" - Kontrollkästchen beschrieben werden kann. Ich würde lieber ein Paar Optionsfelder verwenden (z. B. "Do it the Foo way" und "Do not the bar way"), aber im Moment sind alle anderen Felder in meinem Formular datengebunden an ein Geschäftsobjekt. Ich möchte auch das Radiobutton-Paar an das Business-Objekt binden, aber ich habe noch keinen guten Weg gefunden, es zu tun. Ich kann eine der Schaltflächen an das Feld binden, so dass das Feld "True" festgelegt wird, wenn die Schaltfläche ausgewählt ist, während die Auswahl der anderen Schaltfläche die erste deaktiviert (dh die beiden Optionsfelder sind ordnungsgemäß verknüpft) ), der Wert des Feldes wird nicht aktualisiert, um dies zu reflektieren.

Ich würde gerne sagen können

%Vor%

aber ich bin mir ziemlich sicher, dass es beim Laufen rausschmeißen wird. Gibt es einen einfacheren Weg, oder sollte ich nur darüber nachdenken, wie man ein einzelnes Kontrollkästchen anspricht? Ich möchte keine zusätzlichen Funktionen hinzufügen, um etwas so Triviales zu handhaben ...

ETA: Ein Kommentator hat vorgeschlagen, ein Dropdown (ComboBox) in Betracht zu ziehen. Ich hatte darüber nachgedacht, aber wie würde ich das an ein boolesches Feld in einer Datenbank / Eigenschaft in einem Geschäftsobjekt binden? Wenn ich das SelectedItem an die useFoo -Eigenschaft binden würde, was würde dann in der Items-Auflistung passieren? Muss ich nur "True" und "False" hinzufügen, oder könnte ich irgendwie ein Schlüssel / Wert-Paar-Objekt hinzufügen, das ein angezeigtes Objekt ("Use Foo" / "Do not Use Foo") an den booleschen Wert dahinter bindet? Ich habe Probleme, Dokumente zu diesem Thema zu finden.

Über die Antwort: Die Lösung, die ich durchführte, beinhaltete das Modifizieren des Geschäftsobjekts - die Grundidee ist der von Gurge sehr ähnlich, aber ich habe es separat gefunden, bevor ich seine Antwort gelesen habe. Kurz gesagt, ich habe eine separate Eigenschaft hinzugefügt, die einfach !useFoo zurückgibt. Ein Optionsfeld ist an source.UseFoo gebunden und das andere ist an source.UseBar (der Name der neuen Eigenschaft) gebunden. Es ist wichtig, sicherzustellen, dass die neue Eigenschaft sowohl Getter als auch Setter hat, oder Sie werden mit wirklich merkwürdigem Verhalten enden.

    
Coderer 05.12.2008, 20:07
quelle

6 Antworten

1

Ich habe einen Weg gefunden, dies mit DataSet / DataTable zu tun.

Ich mache eine berechnete Spalte in der DataTable mit dem Ausdruck IIF (Foo = true, false, true). Nennen wir diese Spalte Bar.

Der Balken ist vom Typ Boolean. Jetzt können Sie einen Radiobutton.checked an Foo und einen an Bar binden.

Um zu erreichen, dass Balkenprüfung / -abbruch zu Foo weitergeleitet wird, müssen Sie zum generierten DataTable-Code gehen und eine Zeile hinzufügen, die letzte in diesem Beispiel:

%Vor%     
Guge 06.12.2008, 00:06
quelle
5
  1. Binden Sie das RadioButton , das direkt mit Ihrem booleschen Wert verknüpft ist (dh, wenn der Wert true ist).
  2. Fügen Sie dem CheckedChanged -Ereignis für diesen RadioButton einen Ereignishandler hinzu, der wie folgt aussieht:

    %Vor%
Mac 16.09.2009 10:02
quelle
1

Wenn Ihr Business-Objekt INotifyPropertyChanged implementiert (wodurch die Bindungsarbeit angenehmer wird), können Sie der visuellen Schnittstelle den folgenden Code hinzufügen: BO ist Ihr Geschäftsobjekt und wird mit events deklariert und BO.Value ist die boolesche Eigenschaft, die Sie möchten binden an.

%Vor%

Die folgenden Bindungen verbinden die Optionsfelder.

%Vor%

Die visuelle Schnittstelle sollte auch INotifyPropertyChanged implementieren. Diese Methode funktioniert auf beide Arten: Der ursprüngliche Wert wird aktualisiert, wenn sich die Schnittstelle ändert, und wenn sich der ursprüngliche Wert ändert, wird die Schnittstelle korrekt aktualisiert.

    
Joe Gavin 18.12.2008 17:56
quelle
1

Ich stieß auf das gleiche Problem und fand heraus, dass es mit Standard-Datenbindung möglich ist:

%Vor%

Standardmäßig ist DataSourceUpdateMode auf OnValidation eingestellt. Durch Setzen auf OnPropertyChanged wird die Änderung sofort an das datengebundene Objekt weitergegeben.

Mein Geschäftsobjekt implementiert INotifyPropertyChanged ;

Beim Testen dieser Lösung habe ich festgestellt, dass mein OnPropertyChanged -Ereignis zweimal ausgelöst wurde, als ich auf button2 geklickt habe. Um dies zu verhindern, setzen Sie einfach

%Vor%

wie hier gezeigt: Verlassen von TextBox bewirkt, dass PropertyChanged zweimal ausgelöst wird

    
vi3x 31.03.2016 13:23
quelle
1

Mache es manuell im Code. Wenn Sie das Formular laden, setzen Sie Ihre Optionsfelder entsprechend Ihrer Datenbank. Wenn Sie eine "Speichern" -Taste drücken, speichern Sie den Status wie gewünscht. In diesem Beispiel werden Funkgeräte als Bitfelder in der Datenbank gespeichert.

%Vor%

-

%Vor%

Ich habe versucht, Elemente aus dem Bereich "Datenquellen" in Visual Studio 2015 zu ziehen, als ich meine Optionsfelder als Boolesche Werte in der Tabelle definiert habe. Es gibt jedoch Probleme, wenn die Boolesche Werte nicht auf false gesetzt werden, wenn ein anderes Optionsfeld ausgewählt wird. Wenn die Option "causesValidation" in falsche Radiobuttons geändert wird, wird beim Wechseln zwischen anderen Texteingabefeldern automatisch deaktiviert.

    
Pete 23.05.2017 11:49
quelle
-3

Sie sollten nur eines der Steuerelemente binden müssen, solange Sie sicherstellen, dass sie sich in derselben Gruppe befinden.

Sie könnten auch ein DropDown in Betracht ziehen.

    
Excel Kobayashi 05.12.2008 22:14
quelle