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

C W*_*ker 17 c# data-binding datagridview winforms

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

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

我能让它发挥作用的唯一方法是......

dataGridView.DataSource = null;  
dataGridView.DataSource = myBindingList
Run Code Online (Sandbox Code Playgroud)

...但我真的想避免这种情况,因为它会使滚动条弹回到顶部,这意味着我必须再次设置我的单元格背景颜色.当然有更好的方法.我已经尝试了刷新(以及刷新父级),更新和无效,但他们没有做我需要的.

我已经在一些留言板上看到了这个问题,但还没有看到它的工作答案.

Oli*_*ver 23

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

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

所以我的第一个问题是:INotifyPropertyChanged正确实施你的物品?


Cav*_*rna 6

只需myBindingList.ResetBindings()在您的数据发生变化时调用!

  • 这不是一个好的解决方案,因为即使只有 1 个单元格需要更新,整个网格也会被重新绘制。在小网格中这还可以,但在大网格和每秒大量数据更改的情况下,您将遇到主要的性能问题。如果您不使用 INotifyPropertyChanged 而是使用 ResetItem 来确保只重绘必要的内容 (2认同)

She*_*har 5

您的数据源应该实现INotifyPropertyChangedBindingList中的任何更改,以反映在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;
Run Code Online (Sandbox Code Playgroud)