值更改时绑定到 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的datagridview
当 BindingList 中的现有项目发生更改时,Listbox 拒绝更新
从 BindingList 中删除最后一条记录选择最后一行导致 DataGridView 滚动