15

我想DataGridView在 Windows 窗体应用程序中显示自定义集合。此自定义集合实现ICollection, 和IEnumerable. 我设置了一个BindingSource, 使用集合作为 .DataSource 属性。DataGridView设置为使用我的BindingSource数据源。BindingSource.Add()当我使用该方法将新项目添加到集合中DataGridView时,新项目会正确更新。BindingSource另一方面,DataSource 不会:

MyCustomCollection myCollection = new MyCustomCollection();

myCollection.Add(myCustomObject1);
myCollection.Add(myCustomObject2);

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

在上面的代码中,myBindingSource 的内部 List 包含正确数量的记录 (3),并且DataGridView也包含三个记录,但 myCollection 只包含两个记录。我知道更改基础 myCollection 不会更新 theBindingSource或 the DataGridView,因为它不是 a BindingList<T>,但我的印象是BindingSource直接更新 a 将确保 myCollection 同时更新。

有没有办法使用不是 a 的集合BindingList<T>并在与直接交互时更新它BindingSource

更新:我在所有部分(Collection、BindingSource、DataGridView)中更新数据的一种方法如下:

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

我很确定有更好的方法来解决这个问题,但这是产生我期望的结果的唯一方法。

4

4 回答 4

8

问题是填充适配器。当您加载表单时,填写已为您完成。只需确保进行重新填充,然后在任何数据更改后使用重置绑定进行跟进,网格将被刷新。

例子 :

WorkTableAdapter.Insert(objData.XAttribute, "",
  objData.YAttribute,objLoanData.Amount_IsValid, DateTime.Now, DateTime.Now);
this.WorkTableAdapter.Fill(this.POCDataSet.Work);
this.WorkBindingSource.ResetBindings(false);
于 2015-05-04T21:03:18.370 回答
3

如果您使用无法代表您执行此操作的容器,则必须在数据源更改后手动调用 ResetBindings()。

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

使绑定到 BindingSource 的控件重新读取列表中的所有项目并刷新它们的显示值。

于 2013-01-28T21:24:27.333 回答
3

重置单个项目有效!

如果只有一项频繁更改,我对 .ResetBindings(false) 没有运气,并且重新分配数据源会导致潜在的开销闪烁。

我尝试了使用 PropertyChanged 的​​内置机制,但没有更新。

使用 ResetItem() 重置单个项目有效!

        for (int i = 0; i < bindingSource1.Count; i++)
        {
            bindingSource1.ResetItem(i);   
        }

甚至更好 - 如果您有一个更新事件附加到绑定源中的每个数据项,您可以在绑定源中找到对象并使用对象的索引来调用 ResetItem(idx)

在这种情况下,我的自定义事件 args 包含一个字典键,指向包含在单独集合中的数据对象。在使用 bindningsource.IndexOf() 定位对象后,它会单独刷新。

    void Value_PropertyChanged(object sender, RegisterEventArgs e)
    {

        var idx = bindingSource1.IndexOf(registers_ref[e.registerID]);
        if (idx>=0)
        {
            bindingSource1.ResetItem(idx);                
        }

    }
于 2016-09-29T22:07:04.960 回答
1

我相信我不久前遇到了这个问题 - 我在我的代码的文件中找到了,我认为这是对我有用的解决方案。

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

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

于 2013-01-28T22:37:39.393 回答