WinForms - 在运行时更改控件的bindingsource / datasource?

时间:2011-08-18 13:58:26

标签: c# winforms data-binding

我有一个带有BindingSource组件的Winforms应用程序,它的DataSource设置为我为自定义数据对象创建的DataSource。表单上还有几个控件,这些控件绑定到通过BindingSource公开的对象的各种属性。其中许多控件都是组合框,并且会显示带有后备枚举的值,因此我正在为这些控件设置DataSource,如下所示:

        comboBox1.DataSource = new BindingSource(Utility.ToList(typeof(DataObject.EnumValues)), null);
        comboBox1.DisplayMember = "Value";
        comboBox1.ValueMember = "Key";

这一切都运行良好,但我有两个组合框,我需要能够在运行时更改以显示其他值(使用不同的后部枚举)。在这两种情况下,我在这样的代码中创建初始绑定和数据源:

        comboBox2.DataBindings.Add(new Binding("SelectedValue", this.bindingSource, "PropertyName1", true));
        comboBox2.DataSource = new BindingSource(Utility.ToList(typeof(DataObject.FirstSetOfEnumValues)), null);
        comboBox2.DisplayMember = "Value";
        comboBox2.ValueMember = "Key";

...然后当我需要comboBox2绑定并显示不同的值时,我这样做:

        comboBox2.DataBindings.Clear();
        comboBox2.DataBindings.Add(new Binding("SelectedValue", this.bindingSource, "PropertyName2", true));
        comboBox2.DataSource = null;
        comboBox2.DataSource = new BindingSource(Utility.ToList(typeof(DataObject.SecondSetOfEnumValues)), null);
        comboBox2.DisplayMember = "Value";
        comboBox2.ValueMember = "Key";

我能说的最好,这个工作正常,但它很丑陋并且 是一个更好的方法来做到这一点,对吧?如果你知道它是什么,我很乐意听到它!非常感谢!

2 个答案:

答案 0 :(得分:1)

如果这是一个Web表单,我可能会建议将ComboBox2作为两个单独的ComboBox并隐藏/显示您需要的那个。虽然我很欣赏WinForm项目并不是那么容易,除非你使用流畅的布局?

您可以根据枚举类型添加一个函数来返回您的数据源......我认为您在调用Clear()之后不需要重新设置DisplayMember和ValueMember属性(但我可能错了)

除此之外,我认为你不能简化它。虽然我很高兴听到有人有更好的解决方案:)

答案 1 :(得分:0)

您不需要将ComboBox绑定到BindingSource的新实例。

将您的ComboBox绑定到各自的BindingSources。这可以通过Windows窗体设计器完成,也可以在您自己的代码中手动完成。如果在代码中执行此操作,请务必保留对BindingSource的引用。如果您使用Designer,则会为您的Form类添加一个成员。

然后,当您想要显示一组不同的值时,您需要做的就是更改BindingSources上的DataSource,并且ComboBox会相应地更新。

干杯