设想:
基本上我有一个
System.Windows.Forms.DataGridView
继承 BindingSource 和 IBindingList 的类
具有 2 个标准 List 作为私有属性的类
DataGridView dgv = 新...
MyBindingSource bindingSource = new ...
MyList 列表 = 新...
DataGridView.DataSource 属性设置为 BindingSource,BindingSource.DataSource 设置为列表的私有列表之一
bindingSource.DataSource = list.ListA;
dgv.DataSource = 绑定源;
我从数据库中获取了一堆信息流,我将信息转换为对象并一次将其添加到 MyList 中,最后应该显示在 DataGridView 中。
我希望这一切都有意义,现在问题是:将单个对象添加到列表(不是绑定源)后,我希望该项目显示在 DataGridView 中。但是我目前可以让它工作的唯一方法是构造一个 bindingSource 的另一个实例,附加了 1 个新对象,并将 DataGridView.DataSource 设置为新的 bindingSource。这当然是非常低效的,并且datagridview每次都必须使整个事情无效,这是狡猾的。
相反,我希望 List 通知 BindingSource,它告诉 DataGridView 添加了一个新对象,这样它就可以做到这一点。我试过这个,但我一直收到一个 IndexOutOfrange 异常,说“索引 -1 的项目没有值”。我查看了 BindingSource,确实位置是 -1,并且 Current 属性抛出了同样的异常。当我每次位置和当前属性正确时创建新的 BindingSource 时。
那么,当我将项目添加到列表时,我必须做什么才能更新这些属性?我用反射器打开它,看看它的设置位置,看起来“CurrencyManager”与它有关。我尝试了一些类似 base.OnDataMemberChanged base.OnListChanged 的方法无济于事。
编辑:忘了提我只有在点击数据网格视图中的一行时才会出现异常,它会很好地添加项目。所以这就像 DataGridView 与 BindingSource 不同步