Frage

Ich habe ein binäres Feld in meiner Datenbank, die „Ist XXXX?“ In einer Benutzeroberfläche zu beschreiben unter Verwendung einer einzige hart ist - Typ Checkbox. Ich würde lieber ein Paar von Radio-Buttons verwenden (zum Beispiel „Do it die Foo Weg“ und „Do it der Bar Weg“), aber in diesem Augenblick alle anderen Felder auf meiner Form sind dagetenbundenen zu einem Business-Objekt. Ich möchte auch das Paar von Radio-Buttons auf dem Business-Objekt-Daten binden, aber nicht mit einer guten Art und Weise kommen sie noch zu tun. Ich kann auf eine der Schaltflächen auf das Feld binden, so dass das Feld gesetzt „true“, wenn die Schaltfläche ausgewählt ist, aber während der anderen Taste wird die Auswahl des ersten de-select (das heißt, die beiden Radiobuttons richtig gepaart ), aktualisieren Sie den Wert des Feldes nicht, dies zu reflektieren.

Ich möchte in der Lage sein zu sagen,

button1.DataBindings.Add(new Binding("checked", source, "useFoo"));
button2.DataBindings.Add(new Binding("checked", source, "!useFoo"));

, aber ich bin mir ziemlich sicher, dass werfen, wenn es läuft. Gibt es einen einfacheren Weg, oder sollte ich nur mehr put dachte darüber, wie ein einzelnes Kontrollkästchen zu Wort? Ich möchte nicht, zusätzliche Funktionen hinzuzufügen, etwas trivial zu behandeln ...

ETA: Ein Kommentator hat vorgeschlagen, angesichts einer Drop-Down (ComboBox). Ich hatte darüber nachgedacht, aber wie würde ich Daten-bind, dass in ein Booleschen Feld in einer Datenbank / Objekt in einem Business-Objekt? Wenn ich die SelectedItem an die useFoo Eigenschaft binden, was in der Items-Auflistung gehen würde? Habe ich nur „True“ und „False“ hinzuzufügen, oder könnte ich irgendwie ein Schlüssel / Wert-Paar Objekte hinzufügen, das ein angezeigtes Element bindet ( „Use Foo“ / „Nicht verwenden Foo“), um den Booleschen Wert dahinter? Ich habe Probleme docs auf diese zu finden.


über die Antwort ein: die Lösung, die ich mit in Liquidation ging es um das Business-Objekt zu modifizieren - die Grundidee ist sehr ähnlich die gepostet von Gurge, aber ich kam mit ihm getrennt, bevor ich seine Antwort lesen. Kurz gesagt, habe ich eine separate Eigenschaft, die einfach !useFoo zurückgibt. Ein Radioknopf ist an source.UseFoo gebunden ist, und das andere ist verpflichtet, source.UseBar (den Namen der neuen Eigenschaft). Es ist wichtig, beide Getter und Setter sicherstellen, dass die neue Eigenschaft hat, oder Sie werden mit wirklich seltsame Verhalten aufzuwickeln.

War es hilfreich?

Lösung

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

Ich mache eine berechnete Spalte in der Datentabelle mit dem Ausdruck IIF(Foo=true, false, true). Lassen Sie uns diese Spalte Bar nennen.

Bar ist vom Typ Boolean. Jetzt können Sie ein RadioButton.Checked binden an Foo und ein bis Bar.

Bar Prüfung erhalten / unchecking zurück zu propagieren Foo Sie auf den erzeugten Code Datatable gehen muss und eine Zeile hinzufügen, die letzten in diesem Beispiel:

[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
public bool Bar {
    get {
        try {
            return ((bool)(this[this.tableradio.BarColumn]));
        }
        catch (global::System.InvalidCastException e) {
            throw new global::System.Data.StrongTypingException("The value for column \'Bar\' in table \'radio\' is DBNull.", e);
        }
    }
    set {
        this[this.tableradio.BarColumn] = value;
        this[this.tableradio.FooColumn] = !value;
    }
}

Andere Tipps

  1. Binden Sie die RadioButton, die direkt auf Ihrem boolean Wert verknüpft ist (dh überprüft wird, wenn der Wert true).
  2. ein Event-Handler zum CheckedChanged Ereignisse auf diesem RadioButton hinzufügen, die wie folgt aussieht:

    private void radioButton_CheckedChanged(object sender, EventArgs e)
    {
        foreach (Binding b in ((Control)sender).DataBindings)
            b.WriteValue();
    }
    

Wenn Ihr Business-Objekt implementiert INotifyPropertyChanged (die Bindung Arbeit schöner macht), können Sie den folgenden Code in die visuelle Schnittstelle hinzufügen, wo BO ist Ihr Business-Objekt und Withevents deklariert und BO.Value ist die Boolesche Eigenschaft, die Sie binden möchten.

Public Property NotValue() As Boolean
    Get
        Return Not BO.Value
    End Get
    Set(ByVal value As Boolean)
        BO.Value = Not value
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue"))
    End Set
End Property


Private Sub BO_PropertyChanged(ByVal sender As Object, ByVal e As System.ComponentModel.PropertyChangedEventArgs) Handles BO.PropertyChanged
    If e.PropertyName = "Value" Then
        RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs("NotValue"))
    End If
End Sub

Die folgenden Bindungen werden die Radio-Buttons anschließen.

RBTrue.DataBindings.Add(New Binding("Checked", Me.BO, "Value", False, DataSourceUpdateMode.OnPropertyChanged))
RBFalse.DataBindings.Add(New Binding("Checked", Me, "NotValue", False, DataSourceUpdateMode.OnPropertyChanged))

Die visuelle Schnittstelle sollte auch INotifyPropertyChanged implementieren. Diese Methode funktioniert in beiden Richtungen. Der ursprüngliche Wert wird, wenn die Änderungen in der Benutzeroberfläche aktualisiert und wenn der ursprüngliche Wert ändert wird die Schnittstelle aktualisieren korrekt

Ich kam in dem gleichen Problem, und fand heraus, es mit Standard-Datenbindung tatsächlich möglich ist:

button1.DataBindings.Add(new Binding("checked", source, "useFoo", false, DataSourceUpdateMode.OnPropertyChanged);
// no need to databind button 2, since button1.checked 
// is set to false when button2 is checked

In der Standardeinstellung ist DataSourceUpdateMode auf OnValidation. Indem es in OnPropertyChanged, wird die Änderung sofort in das Databound-Objekt weitergegeben.

Ihr Business-Objekt implementiert INotifyPropertyChanged;

Durch diese Lösung zu testen, fand ich, dass mein OnPropertyChanged Ereignis zweimal gefeuert wurde, als ich button2 wurde klicken. Um dies zu verhindern, geben Sie einfach

button1.CausesValidation = false;
button2.CausesValidation = false;

wie hier gezeigt: TextBox leave verursacht Property zweimal gefeuert

Machen Sie es manuell im Code. Wenn Sie das Formular laden, geben Sie Ihre Radio-Buttons nach Ihrer Datenbank. Wenn Sie die Taste eine Schaltfläche „Speichern“ speichern de Zustand, wie Sie wollen. Dieses Beispiel speichert Radios als Bit-Felder in der Datenbank.

        // Load radio state
        radioButton1.Checked = ((myModel)myBindingSource.DataSource).boolOption1;
        radioButton2.Checked = ((myModel)myBindingSource.DataSource).boolOption2;

-

        // Save radio state
        ((myModel)myBindingSource.DataSource).boolOption1 = radioButton1.Checked;
        ((myModel)myBindingSource.DataSource).boolOption2 = radioButton2.Checked;

Ich habe versucht, Elemente aus dem „Datenquellen“ Panel in Visual Studio 2015 zu ziehen, wenn ich meine Radio-Buttons als booleans in der Tabelle definiert, aber es gibt Probleme mit den booleans nicht falsch aktualisiert werden, wenn ein anderes Optionsfeld ausgewählt ist. Bei einer Änderung des „Causes“ false Radiobuttons automatisch nicht markiert, wenn sie zwischen anderen Texteingabefeldern springen.

Sie sollten nur eine der Kontrollen binden, solange Sie sicherstellen, dass sie in der gleichen Gruppe sind.

Sie können auch eine DropDown betrachten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top