我如何使用数据绑定与Windows形式无线电按钮?
-
19-08-2019 - |
题
我有一个二元域在我的数据库,这是很难描述在一个用户界面,使用一个单一的"是XXXX?"-类型选项。我宁愿使用对无线电按钮(例如"这样做的Foo方式"和"不做这条路"),但现在的所有其他领域对我的形式是数据往来业务对象。我想到的数据结合对无线电按钮的业务对象,但还没有想出了一个很好的方式来这样做。我可以结合一个按钮的领域,这样该领域设定"真正的"如果按钮被选中,但是在选择时的其他按钮不解的选择的第一个(就是说,两个无线电按钮都适当地搭配),值的领域没有更新以反映这一点。
我想可以说
button1.DataBindings.Add(new Binding("checked", source, "useFoo"));
button2.DataBindings.Add(new Binding("checked", source, "!useFoo"));
但我敢肯定,将把当运行。是有一个更简单的方法,或者我是不是应该更多地考虑如何字的一个单一的框?我不想添加额外的功能来处理这个平凡的...
ETA:一位评论者建议在考虑一下拉(组合框).我有想过这一点,但我怎么会数据结合到一个布尔现场数据库中的/财产中的业务对象?如果我约束SelectedItem的useFoo财产会怎么进去的项目集合?要我加入只是"真实"和"虚假",或者我可以以某种方式添加一个key/value pair对象联系的一个显示项目("使用Foo"/"不使用Foo")的布尔价值的背后吗?我有麻烦找到文件这一点。
有关的回答:解决我的伤口最多使用涉及修改的业务对象--的基本思想是非常相似的一个发布的Gurge,但是我想出来单独前我读了他的响应。总之,我增加了一个单独的财产,仅仅是返回 !useFoo
.一个无线电按钮以开 source.UseFoo
, 和其他必要 source.UseBar
(名称的新财产)。重要的是要确保新的酒店拥有两个干将与者,或只有很奇怪的行为。
解决方案
我已经发现这样做使用数据集/数据表的方法。
我使在用表达IIF(Foo=true, false, true)
数据表计算的列。让我们把该列Bar
。
Bar
是布尔类型的。现在可以结合一种RadioButton.Checked
到Foo
和一个Bar
。
要获得Bar
选中/取消选中传播回Foo
你必须去生成的数据表代码,并添加一行,最后一个在此示例中:
[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;
}
}
其他提示
- 绑定的
RadioButton
这是直接链接到你的布尔价值(即检查当值true
). 添加一个事件处理程序
CheckedChanged
在这个事件RadioButton
这看起来像下:private void radioButton_CheckedChanged(object sender, EventArgs e) { foreach (Binding b in ((Control)sender).DataBindings) b.WriteValue(); }
如果您的业务对象实现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。这种方法是双向的:如果接口的原始值更改更新,并且如果原始值改变了界面将正确更新
我碰到了同样的问题,并发现它实际上可能与标准数据绑定:
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;
手动做在代码。当加载形式根据你的数据库设置你的单选按钮。当你按下“保存”按钮店de状态,如你所愿。本实施例中存储无线电装置作为数据库中的位字段。
// 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,当我定义我的单选按钮如表中的布尔值,但存在与布尔值选择另一单选按钮时不被更新为假的问题。如果未选中自动改变“的CausesValidation”为假单选按钮其他文本输入字段之间跳跃时。
您应该只需要绑定控件之一,只要你确保它们是在同一个组。
您也可以考虑一个下拉菜单。