动态更改数据源?

时间:2013-01-01 20:37:28

标签: c# .net data-binding combobox

我有一个绑定到对象列表的WinForms组合框列出这个:

BindingList<myObject> myListOfObjects = new BindingList<myObject>();

// 100 objects are added to myListOfObjects

bindingSource1.DataSource = myListOfObjects;
comboBox1.DataSource = bindingSource1;
comboBox1.DisplayMember = "Name";

我的对象的每个实例都包含以下内容:

public string Name
public int Index
public List<int> Codes = new List<int>();

该对象还实现了INotifyPropertyChanged。

当在组合框中选择对象“名称”时,我想将列表框数据绑定到所选对象的“代码”列表。我正试图这样做:

private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
    listBox1.DataSource = myListOfObjects[((myObject)comboBox1.SelectedValue).Index].Codes;
}

这不起作用,我得到一个InvalidCastException(特别是Int32不能转换为myObject)。我是不是错了?

1 个答案:

答案 0 :(得分:2)

问题是combobox1.SelectedValue将设置为组合框的myObject中指定的ValueMember属性。

要获取基础myObject,您需要使用comboBox1.SelectedItem

listBox1.DataSource = myListOfObjects[((myObject)comboBox1.SelectedItem).Index].Codes;

如果这是我的代码,我还会仔细检查以确保在直接使用之前SelectedItem不为null:

if (comboBox1.SelectedItem != null) {
    listBox1.DataSource = myListOfObjects[((myObject)comboBox1.SelectedItem).Index].Codes;
} else {
    listBox1.DataSource = null;
}