3

设想:

基本上我有一个

  • 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 不同步

4

3 回答 3

2

当 DataSource 更改其内容时,DataGridView 会清除其网格并引发 SelectionChanged 事件以及与用户交互相关的其他事件。重要的是要知道,当引发事件时,根本没有要显示的数据,所以如果你有一个 SelectionChanged 事件侦听器并且它正在访问内部的行或列,它会在访问行时引发越界异常。解决方案:在使用任何数据网格资源之前,始终检查 Rows.count 是否为 0 值。干杯

于 2010-05-18T16:40:34.900 回答
1

您是否考虑过使用ObservableCollection?每当从集合中添加或删除项目时,它都会通知与其绑定的控件已更新。它也会对集合中项目的属性执行相同的操作(尽管您必须手动引发事件)

我不确定是什么导致了异常

于 2010-02-25T02:52:29.993 回答
1

如果您使用 BindingList(generic) 代替,它将通知项目添加/删除以及单个项目更改。( http://msdn.microsoft.com/en-us/library/ms132679.aspx )

于 2010-02-25T08:08:28.397 回答