在的WinForms的BindingSource的更新不更新数据源收集(Updating of Bi

2019-08-08 15:13发布

我想在显示自定义集合DataGridView在Windows窗体应用程序。 这种定制集合实现ICollectionIEnumerable 。 我已经建立了一个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的将不会更新BindingSourceDataGridView ,因为它不是一个BindingList<T>但我的印象是,更新下BindingSource直接将确保MyCollection的是在同一时间进行更新。

有没有办法使用一个集合,是不是办法BindingList<T>并将它与交互时更新BindingSource直接?

更新 :一种方法我已经得到了所有的部分(收集,BindingSource的,DataGridView中)如下更新的数据:

myCollection.Add(myCustomObject3);
myBindingSource.DataSource = null;
myBindingSource.DataSource = myCollection;

我敢肯定有一个更好的方式来攻击这个问题,但是这是系统产生我所期待的结果的唯一方法。

Answer 1:

问题是加注接头 。 当你加载你的形式, 填充为你做了。 只要确保做笔芯,然后跟进复位绑定发布任何数据变化和电网将得到刷新。

例如:

WorkTableAdapter.Insert(objData.XAttribute, "",
  objData.YAttribute,objLoanData.Amount_IsValid, DateTime.Now, DateTime.Now);
this.WorkTableAdapter.Fill(this.POCDataSet.Work);
this.WorkBindingSource.ResetBindings(false);


Answer 2:

你将不得不如果你使用一个容器,可以这样做,以您的名义手动调用ResetBindings()的数据源改变后。

http://msdn.microsoft.com/en-us/library/system.windows.forms.bindingsource.resetbindings.aspx

使绑定到BindingSource重新读取列表中的所有项目,并刷新自己的显示值的控制。



Answer 3:

我相信我前一阵子就遇到了这个问题 - 我在我的代码文件做了找,我觉得这是对我工作的解决方案。

        // Applies pending changes to the underlying data source.
        this.bindingSource1.EndEdit();

这是在保存按钮点击处理程序的上下文。



Answer 4:

复位单个项目工程!

我曾与.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