动态更改数据源

本文关键字:数据源 动态 | 更新日期: 2023-09-27 17:50:25

我有一个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。

当在组合框中选择对象"Name"时,我想将一个列表框绑定到所选对象的"Codes"列表。我想这样做:

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

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

动态更改数据源

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

为了获得底层的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;
}