我有一个二元域在我的数据库,这是很难描述在一个用户界面,使用一个单一的"是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.CheckedFoo和一个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;
    }
}

其他提示

  1. 绑定的 RadioButton 这是直接链接到你的布尔价值(即检查当值 true).
  2. 添加一个事件处理程序 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;

如下所示: 文本框休假导致的PropertyChanged被解雇两次

手动做在代码。当加载形式根据你的数据库设置你的单选按钮。当你按下“保存”按钮店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”为假单选按钮其他文本输入字段之间跳跃时。

您应该只需要绑定控件之一,只要你确保它们是在同一个组。

您也可以考虑一个下拉菜单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top