值更改时绑定到 BindingList 的 DataGridView 不刷新

Posted

技术标签:

【中文标题】值更改时绑定到 BindingList 的 DataGridView 不刷新【英文标题】:DataGridView bound to BindingList does not refresh when value changed 【发布时间】:2011-03-21 09:23:07 【问题描述】:

我有一个绑定到 BindingList(C# Windows 窗体)的 DataGridView。如果我更改列表中某个项目中的一个值,它不会立即显示在网格中。如果我单击更改的单元格,或最小化然后最大化窗口,它会正确更新,但我需要它自动发生。

我之前也遇到过同样的问题,但在这种情况下,我必须在值更改的同时更改单元格的背景颜色。这会导致单元格正确刷新。

我可以让它工作的唯一方法是......

dataGridView.DataSource = null;  
dataGridView.DataSource = myBindingList

...但我真的很想避免这种情况,因为它会使滚动条弹回顶部,这意味着我必须再次设置单元格背景颜色。肯定有更好的办法。我已经尝试过 Refresh(以及刷新父级)、Update 和 Invalidate,但它们没有做我需要的。

我在一些留言板上看到过这个问题,但还没有看到有效的答案。

【问题讨论】:

【参考方案1】:

仅当列表项类型实现INotifyPropertyChanged 接口时,才会引发有关项值更改的ListChanged 通知。

取自:http://msdn.microsoft.com/en-us/library/ms132742.aspx

所以我的第一个问题是:正确实现您的项目INotifyPropertyChanged

【讨论】:

谢谢,非常感谢【参考方案2】:

您的数据源应实现INotifyPropertyChanged,以使 BindingList 中的任何更改都反映在 datagridview 中。

class Books : INotifyPropertyChanged

   private int m_id;
   private string m_author;
   private string m_title;

   public int ID  get  return m_id;  set  m_id = value; NotifyPropertyChanged("ID");  
   public string Author  get  return m_author;  set  m_author = value; NotifyPropertyChanged("Author");  
   public string Title  get  return m_title;  set  m_title = value; NotifyPropertyChanged("Title");  


   public event PropertyChangedEventHandler PropertyChanged;

   private void NotifyPropertyChanged(string p)
   
       if (PropertyChanged != null)
           PropertyChanged(this, new PropertyChangedEventArgs(p));
   


BindingList<Books> books= new BindingList<Books>();

datagridView.DataSource = books;

【讨论】:

这太完美了。非常感谢。 MSDN 应该与 *** 签订合同来做他们的代码示例;微软还有很多不足之处(“这里有一行代码并不能真正帮助你……”) 天才。节省大量时间和代码。不知道PropertyChanged 会在winforms 中工作。非常感谢!【参考方案3】:

只要您的数据发生变化,只需致电myBindingList.ResetBindings()

【讨论】:

【参考方案4】:

听起来您的更改对象通知未正确触发/处理。 我个人在绑定到 dataGridView 时总是使用 BindingSource 对象。

我会查看DataGridView FAQ 和DataBinding FAQ 并搜索对象更改通知。

如果您使用的是 ADO.Net,请不要忘记调用 .Validate() 和 .EndEdit() 方法。

【讨论】:

【参考方案5】:
    private void refreshDataGrid()
    
        dataGridView1.DataSource = typeof(List<>);
        dataGridView1.DataSource = myBindingList;
        dataGridView1.AutoResizeColumns();
        dataGridView1.Refresh();
    

然后,只要您的列表发生更改,只需调用 refreshDataGrid 方法即可。

【讨论】:

以上是关于值更改时绑定到 BindingList 的 DataGridView 不刷新的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Bindinglist 在数据库更改后不更新?

我的一些课 的成员不会出现绑定到BindingList的datagridview

当 BindingList 中的现有项目发生更改时,Listbox 拒绝更新

从 BindingList 中删除最后一条记录选择最后一行导致 DataGridView 滚动

NullReferenceException未处理C#(使用BindingList)[重复]

C#:将更改从 DataGridView 推送到 BindingList 回数据库?