我有一个有两个ComboBox的表单。我想使用第二个(子)ComboBox根据用户对第一个项目的选择来显示子对象列表。
当表单被实例化时,我将两个控件都数据绑定到私有List< Widget> s,如下所示:
private List<ParentWidget> _parentList;
private List<ChildWidget> _childList;
public FormExample()
{
InitializeComponent();
_parentList = GetParentWidgets();
_childList = new List<ChildWidget>();
cmbParent.DisplayMember = "WidgetName";
cmbParent.ValueMember = "ID";
cmbParent.DataSource = _parentList;
cmbChild.DisplayMember = "WidgetName";
cmbChild.ValueMember = "ID";
cmbChild.DataSource = _childList;
}
当父选择的索引发生变化时,我会用适当的对象填充_childList
。
问题是子ComboBox从不显示集合中的任何对象。如果我在数据绑定之前用至少一个ChildWidget填充集合,它可以工作,但我希望它从空开始。
如果我从another answer正确理解,这是失败的,因为空列表不包含任何要绑定的属性。但是我绑定到特定的类(Widget)而不是通用对象。这对于数据绑定来说还不够吗?
答案 0 :(得分:1)
使用绑定时,最好使用BindingList<>
,问题是List<>
不支持通知更改,因此当数据更改时,控件不知道并更新因此。您可以使用BindingList<>
代替:
private BindingList<ParentWidget> _parentList;
private BindingList<ChildWidget> _childList;
这意味着您必须将方法GetParentWidgets()
的返回类型更改为BindingList<ParentWidget>
,或者您也可以使用BindingList<>
的构造函数:
_parentList = new BindingList<ParentWidget>(GetParentWidgets());
答案 1 :(得分:0)
我要做的是听父组合框的valueChanged事件,当事件触发时我会对子组合进行数据绑定。
cmbParent.SelectedValueChanged += OnParentSelectedValueChanged;
private void OnParentSelectedValueChanged(object sender, EventArgs e)
{
this.UpdateChildList(); // Update the data depending on the value in the parent combo
cmbChild.DisplayMember = "WidgetName"; // I guess you can still do this in the constructor
cmbChild.ValueMember = "ID"; // I guess you can still do this in the constructor
cmbChild.DataSource = _childList;
}