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

Cod*_*rer 9 c# data-binding radio-button winforms

我的数据库中有一个二进制字段很难在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"));
Run Code Online (Sandbox Code Playgroud)

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

ETA:一位评论者建议考虑下拉(ComboBox).我曾考虑过这个问题,但是如何将数据绑定到业务对象的数据库/属性中的布尔字段?如果我将SelectedItem绑定到useFoo属性,那么Items集合中会包含什么?我是否必须添加"True"和"False",或者我可以以某种方式添加一个键/值对对象,将显示的项目("使用Foo"/"不使用Foo")绑定到它后面的布尔值?我在找这个文档时遇到了麻烦.


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

Mac*_*Mac 7

  1. 绑定RadioButton它直接链接到您的布尔值(即在值为时检查true).
  2. CheckedChanged事件上添加一个事件处理程序,RadioButton如下所示:

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


Gug*_*uge 1

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

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

Bar是布尔类型。现在您可以将一绑定RadioButton.CheckedFoo,并将一绑定到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;
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 并且不要忘记每次编辑数据集时再次进行此更改!:-( (2认同)