设计问题:将.NET组合框绑定到对象数组

时间:2011-07-30 23:02:37

标签: .net winforms data-binding combobox

我正在编写一个.NET 4.0 WinForms应用程序来配置硬件设备。例如,假设设备有10个可配置的设置。该设备还可以存储5种不同的配置。所以我创建了一个定义10个设置的配置对象。在我的表单构造函数中,我正在创建一个包含5个配置对象的数组,并将该数组设置为组合框的数据源。用户将从组合框(下拉列表)中选择配置,并且该配置的设置将显示在UI中。当用户通过组合框选择不同的配置时,我需要确保在显示新选择的配置对象的设置之前,UI中的所有设置都已在当前配置对象中更新。我目前正在组合框的SelectedIndexChanged事件处理程序中执行此操作。当用户完成更改设置后,他们会单击一个按钮,将所有五个配置写入硬件设备。这就是问题所在。例如,如果他们选择第三个配置,更改UI中的某些设置,然后单击写入按钮,存储在第三个配置对象中的设置尚未更新,因此UI中反映的设置将不会被获取写入设备。我想过几种解决方法:

  1. 在写入设置按钮的Click事件中,我可以编写新代码,在将所有五种配置的数据写入设备之前,始终使用UI中的当前设置更新相应配置对象中的数据

  2. 在写入设置按钮的Click事件中,我可以通过编程方式将组合框的SelectedIndex值设置为其当前值,从而触发SelectedIndexChange事件处理程序,这将导致设置被写入配置对象重新显示。然后我可以将所有配置写入设备。

  3. 我认为要么可能最大的区别在于为#1编写新代码而不是触发现有的事件处理程序,该处理程序已经包含了#2所需的功能。但是,我越是想到这一点,我就越想知道通常被认为是做这样事情的“正确”方式。有没有人对此有任何想法或想法?非常感谢!

2 个答案:

答案 0 :(得分:1)

听起来你没有使用BindingSource而且你可能做的工作超出了你的需要。

在WinForms中使用数据绑定时,通常不需要使用您提到的大多数事件来完成典型要求。

首先,如果您不熟悉BindingSource,请阅读。

这是你应该如何设置的:

  • 在表单设计器中,从Configuration类(具有10个设置的类)创建一个新的DataSource。

  • 将BindingSource组件添加到表单中。

  • 将BindingSource的DataSource属性设置为刚刚创建的新数据源。

  • 将ComboBox DataSource设置为BindingSource。

  • 将ComboBox DisplayMember设置为BindingSource的适当描述属性(现在代表设置类)。

  • 将10个TextBoxes的Text属性绑定到BindingSource的10个设置属性。

  • 在运行时,将BindingSource的DataSource属性设置为包含5个配置对象的数组。

在此阶段,您可以进行数据绑定。使用UI对某些设置进行更改,更改将反映在数据源(您的阵列)中。

(如果它不起作用或行为异常,您可能需要删除当前正在执行的事件处理。) 请注意,您不需要编写任何代码,以便将用户所做的更改写入数据源。这会自动发生。您只需编写代码即可将数据保留在某处。

默认情况下,每个设置更改只会在文本框失去焦点时反映在数组中,而另一个具有CausesValidation = true的控件将获得焦点。因此,如果您的“写入设置”按钮具有CausesValidation = true(这是默认值),那么当您处理该单击事件时,您的数组将包含所有最新数据。

如果您愿意,可以通过将绑定的UpdateMode更改为OnPropertyChanged,对数据源中立即反映的设置文本框进行任何更改。默认值为OnValidation,这意味着直到焦点移动到另一个具有CausesValidation = true的控件。

还有一件事我现在要停下来(因为我知道我可能会告诉你你已经知道的一切):

考虑让您的设置类实现INotifyPropertyChanged。然后,您可以在用户输入更改时处理PropertyChanged事件以执行验证。或者,您可以处理控件上的验证事件。

如果您已经知道以上所有内容,那么我为做出错误的假设而道歉。从你的问题我得到的印象是你还没有完全发现WinForms数据绑定。

答案 1 :(得分:0)

ComboBox_SelectIndexChangedWriteButton_Click事件中,我都会调用相同的UpdateConfiguration方法。这可确保在需要时始终保存新设置。