场景:的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不同步
你能够使用'DataTable's而不是'List's吗?我用DataTable做了很多东西<-> BindingSource <-> DGV和更新一直非常完美。不知道绑定到列表虽然。 – Ken 2010-02-25 02:27:35
嗯,我不太能胜任DataTables,我不得不改变很多代码。所以我希望为我目前有的修复 – Daniel 2010-02-25 02:35:23