我想在显示自定义集合DataGridView
在Windows窗体应用程序。 这种定制集合实现ICollection
和IEnumerable
。 我已经建立了一个BindingSource
,使用集合作为.DataSource财产。 在DataGridView
被设置为使用我BindingSource
,因为它的数据源。 当我添加一个新的项目使用的收集BindingSource.Add()
方法,该DataGridView
正确使用新项目更新。 该BindingSource
数据源,在另一方面,没有:
MyCustomCollection myCollection = new MyCustomCollection();
myCollection.Add(myCustomObject1);
myCollection.Add(myCustomObject2);
myBindingSource.DataSource(myCollection);
myBindingSource.Add(myCustomObject3);
在上面的代码,myBindingSource的内部列表中包含的记录(3)正确的数量和DataGridView
还包含三条记录,但MyCollection的只包含两个记录。 我知道,改变底层MyCollection的将不会更新BindingSource
或DataGridView
,因为它不是一个BindingList<T>
但我的印象是,更新下BindingSource
直接将确保MyCollection的是在同一时间进行更新。
有没有办法使用一个集合,是不是办法BindingList<T>
并将它与交互时更新BindingSource
直接?
更新 :一种方法我已经得到了所有的部分(收集,BindingSource的,DataGridView中)如下更新的数据:
myCollection.Add(myCustomObject3);
myBindingSource.DataSource = null;
myBindingSource.DataSource = myCollection;
我敢肯定有一个更好的方式来攻击这个问题,但是这是系统产生我所期待的结果的唯一方法。
问题是加注接头 。 当你加载你的形式, 填充为你做了。 只要确保做笔芯,然后跟进复位绑定发布任何数据变化和电网将得到刷新。
例如:
WorkTableAdapter.Insert(objData.XAttribute, "",
objData.YAttribute,objLoanData.Amount_IsValid, DateTime.Now, DateTime.Now);
this.WorkTableAdapter.Fill(this.POCDataSet.Work);
this.WorkBindingSource.ResetBindings(false);
你将不得不如果你使用一个容器,可以这样做,以您的名义手动调用ResetBindings()的数据源改变后。
http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.resetbindings.aspx
使绑定到BindingSource重新读取列表中的所有项目,并刷新自己的显示值的控制。
我相信我前一阵子就遇到了这个问题 - 我在我的代码文件做了找,我觉得这是对我工作的解决方案。
// Applies pending changes to the underlying data source.
this.bindingSource1.EndEdit();
这是在保存按钮点击处理程序的上下文。
复位单个项目工程!
我曾与.ResetBindings(假),并重新分配datsource造成与potentiail闪烁的开销,如果只有一个项目经常变化没有运气。
我尝试使用的PropertyChanged,但没有更新了内置的机制。
正在重置使用ResetItem个别项目()的工作!
for (int i = 0; i < bindingSource1.Count; i++)
{
bindingSource1.ResetItem(i);
}
更妙的是 - 如果您有连接到每个数据项的更新事件的bindningsource你可以找到对象在bindning来源和使用对象的索引来调用ResetItem(IDX)
在这种情况下,我的自定义事件参数包含字典键包含在一个单独收集的数据对象。 对象位于使用bindningsource.IndexOf()后它是单独地刷新。
void Value_PropertyChanged(object sender, RegisterEventArgs e)
{
var idx = bindingSource1.IndexOf(registers_ref[e.registerID]);
if (idx>=0)
{
bindingSource1.ResetItem(idx);
}
}
文章来源: Updating of BindingSource in WinForms does not update Datasource Collection