如何使用Windows窗体单选按钮进行数据绑定?

时间:2008-12-05 20:07:04

标签: c# winforms data-binding radio-button

我的数据库中有一个二进制字段很难在UI中使用单个“Is XXXX?” - 类型复选框进行描述。我宁愿使用一对单选按钮(例如“Do it the Foo way”和“Do it the Bar way”),但是现在我表单上的所有其他字段都是数据绑定到业务对象。我想将这对单选按钮数据绑定到业务对象,但还没有找到一个好方法。我可以将其中一个按钮绑定到该字段,以便在选择按钮时将该字段设置为“true”,但是在选择另一个按钮时取消选择第一个按钮(即,两个单选按钮已正确配对),该字段的值不会更新以反映这一点。

我希望能够说出

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

但我很确定它会在运行时抛出。有没有更简单的方法,或者我应该更多地考虑如何单个复选框?我不想添加额外的功能来处理这个微不足道的事情......

ETA:一位评论者建议考虑下拉(ComboBox)。我曾考虑过这个问题,但是如何将数据绑定到业务对象的数据库/属性中的布尔字段?如果我将SelectedItem绑定到useFoo属性,那么Items集合中会包含什么?我必须补充一点,“真”与“假”,或可不知何故,我补充一点,系上显示的项目(“使用富” /“不使用美孚”),以它后面的布尔值的键/值对的对象?我很难找到这方面的文档。


关于答案:我最后使用的解决方案涉及修改业务对象 - 基本思想与Gurge发布的基本思想非常类似,但在我阅读他的回复之前,我想出了它。简而言之,我添加了一个单独的属性,只返回!useFoo。一个单选按钮绑定到source.UseFoo,另一个单选按钮绑定到source.UseBar(新属性的名称)。重要的是确保新房产既有吸气剂又有吸引人,或者你最终会遇到奇怪的行为。

6 个答案:

答案 0 :(得分:7)

  1. 绑定与您的布尔值直接相关的RadioButton(即,当值为true时检查)。
  2. 为此CheckedChanged上的RadioButton事件添加一个事件处理程序,如下所示:

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

答案 1 :(得分:1)

我找到了一种使用DataSet / DataTable执行此操作的方法。

我使用表达式IIF(Foo=true, false, true)在DataTable中创建一个计算列。我们称之为Bar列。

Bar的类型为布尔值。现在,您可以将一个RadioButton.Checked绑定到Foo,将一个绑定到Bar

要让Bar检查/取消选中以传播回Foo,您必须转到生成的DataTable代码并添加一行,即此示例中的最后一行:

[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;
    }
}

答案 2 :(得分:1)

如果您的业务对象实现了INotifyPropertyChanged(这使得绑定工作更好),您可以将以下代码添加到可视化接口,其中BO是您的业务对象并且声明为withevents而BO.Value是布尔值你想要绑定的属性。

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

以下绑定将连接单选按钮。

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

可视化界面还应实现INotifyPropertyChanged。此方法有两种方式:如果接口更改,原始值将更新,如果原始值更改,则接口将正确更新。

答案 3 :(得分:1)

我遇到了同样的问题,发现标准数据绑定实际上是可能的:

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

默认情况下,DataSourceUpdateMode设置为OnValidation。通过将其设置为OnPropertyChanged,更改将立即传播到数据绑定对象。

我的业务对象实现了INotifyPropertyChanged;

通过测试此解决方案,我发现当我点击OnPropertyChanged时,我的button2事件被触发了两次。为防止这种情况,只需设置

即可
button1.CausesValidation = false;
button2.CausesValidation = false;

如下所示: TextBox leave causes PropertyChanged get fired twice

答案 4 :(得分:1)

在代码中手动执行。加载表单时,根据数据库设置单选按钮。按"保存"按钮存储de state如你所愿。此示例将无线电存储为数据库中的位字段。

        // 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;

我试图从"数据源"中拖出项目。 Visual Studio 2015中的面板,当我将单选按钮定义为表中的布尔值时,但是当选择另一个单选按钮时,布尔值没有更新为假的问题。更改" causeValidation"在其他文本输入字段之间跳转时,自动取消选中false radiobuttons。

答案 5 :(得分:-3)

只要您确定它们位于同一组中,您就应该只需绑定其中一个控件。

你也可以考虑DropDown。