Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将组合框数据绑定到空列表<;CustomObject>;_C#_Winforms_Data Binding - Fatal编程技术网

C# 将组合框数据绑定到空列表<;CustomObject>;

C# 将组合框数据绑定到空列表<;CustomObject>;,c#,winforms,data-binding,C#,Winforms,Data Binding,我有一个表单,它有两个组合框。我想使用第二个(子)组合框根据用户从第一个组合框中选择的项目显示子对象列表 实例化表单时,我将两个控件数据绑定到私有列表,如下所示: private List<ParentWidget> _parentList; private List<ChildWidget> _childList; public FormExample() { InitializeComponent(); _parentList = GetParen

我有一个表单,它有两个组合框。我想使用第二个(子)组合框根据用户从第一个组合框中选择的项目显示子对象列表

实例化表单时,我将两个控件数据绑定到私有列表,如下所示:

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;
}
private List\u parentList;
私人名单(childList);;
public FormExample()
{
初始化组件();
_parentList=GetParentWidgets();
_childList=新列表();
cmbParent.DisplayMember=“WidgetName”;
cmbParent.ValueMember=“ID”;
cmbParent.DataSource=\u parentList;
cmbChild.DisplayMember=“WidgetName”;
cmbChild.ValueMember=“ID”;
cmbChild.DataSource=\u childList;
}
当所选父索引发生更改时,我将使用适当的对象填充
\u childList

问题是子组合框从不显示集合中的任何对象。如果我在数据绑定之前用至少一个ChildWidget填充集合,它就会工作,但我希望它开始为空


如果我从中正确理解,这是失败的,因为空列表不包含任何要绑定的属性。然而,我绑定到一个特定的类(小部件),而不是一个通用对象。这还不足以进行数据绑定吗?

我要做的是监听父组合框的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;   
}

使用绑定时,最好使用
BindingList
,问题是
List
不支持通知更改,因此当数据更改时,控件不知道并相应更新。您可以这样使用
绑定列表

private BindingList<ParentWidget> _parentList;
private BindingList<ChildWidget> _childList;
_parentList = new BindingList<ParentWidget>(GetParentWidgets());

通过将组合框绑定到BindingSource并将BindingSource的数据源设置为原始列表,可以实现相同的行为吗?@JYelton我认为
BindingSource
可以,但是您必须向
BindingSource
本身添加新项,而不是
列表
,使用
绑定列表
还需要将项目添加到
绑定列表
而不是
列表