2010-02-25 62 views
3

场景:的Windows DataGridView的BindingSource的索引超出范围异常

基本上我有一个

  • System.Windows.Forms.DataGridView

  • 继承的BindingSource和IBindingList的

  • 有2个标准列表作为私有属性的类

的DataGridView DGV =新...

MyBindingSource的BindingSource =新...

MYLIST列表=新...

的DataGridView.DataSource属性被设置到BindingSource和将BindingSource.DataSource设置为列表中的其中一个列表

bindingSource.DataSource = list.ListA;

dgv.DataSource = bindingSource;

我得到了一堆信息从数据库中流入,我将信息转换为对象并一次添加到MyList,最后应该显示在DataGridView中。

我希望一切都有道理,现在的问题: 在向列表中添加单个对象(不是绑定源)后,我希望项目显示在DataGridView中。但我目前能够实现这一目标的唯一方法是构造另一个带有1个新对象的bindingSource实例,并将DataGridView.DataSource设置为新的bindingSource。这当然是非常低效的,datagridview每次都会使整个事情失效,这是不可靠的。

相反,我希望列表来通知BindingSource,它告诉DataGridView一个新的对象已被添加,因此它可以做到这一点。我试过这个,但我不断收到一个IndexOutOfrange异常说'项目在索引-1没有价值'。 我看了一下BindingSource,实际上位置是-1,Current属性抛出了同样的异常。当我每次创建新的BindingSource时,位置和当前属性都是正确的。

那么当我向列表中添加项目时,为了让这些属性得到更新,我需要做些什么?我用反射器打开它,看看它被设置的位置,看起来像“CurrencyManager”与它有关。我尝试了一些东西,如base.OnDataMemberChanged base.OnListChanged无济于事。

编辑:忘了提及我只有在datagrid视图中单击行时才会出现异常,它会添加项目。所以它就像DataGridView与BindingSource不同步

+0

你能够使用'DataTable's而不是'List's吗?我用DataTable做了很多东西<-> BindingSource <-> DGV和更新一直非常完美。不知道绑定到列表虽然。 – Ken 2010-02-25 02:27:35

+0

嗯,我不太能胜任DataTables,我不得不改变很多代码。所以我希望为我目前有的修复 – Daniel 2010-02-25 02:35:23

回答

1

您是否考虑过使用ObservableCollection?无论何时添加或从集合中删除项目,都将通知控件其绑定已更新。它也将做同样的收集,以及在项目的性质(虽然你不得不提高手动事件)

我不知道什么可能会造成异常

2

当数据源正在改变其内容,DataGridView中清除其网格和引发SelectionChanged事件和其他事件巫与用户交互连接。知道当事件发生时根本没有数据可以显示,所以如果你有一个SelectionChanged事件监听器,并且它正在访问行或列内部,它将在访问行时引发出界外异常。解决方案:在使用任何数据网格资源之前,始终检查Rows.count的值是否为0。欢呼声