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

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

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

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

dataGridView.DataSource = null;  
dataGridView.DataSource = myBindingList

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

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

【问题讨论】:

    标签: c# winforms data-binding datagridview


    【解决方案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 应该与 StackOverflow 签订合同来做他们的代码示例;微软还有很多不足之处(“这里有一行代码并不能真正帮助你……”)
    • 天才。节省大量时间和代码。不知道PropertyChanged 会在winforms 中工作。非常感谢!
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:
            private void refreshDataGrid()
            {
                dataGridView1.DataSource = typeof(List<>);
                dataGridView1.DataSource = myBindingList;
                dataGridView1.AutoResizeColumns();
                dataGridView1.Refresh();
            }
        

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

        【讨论】:

          猜你喜欢
          • 2013-06-10
          • 2015-12-26
          • 1970-01-01
          • 1970-01-01
          • 2021-11-04
          • 2011-06-16
          • 1970-01-01
          • 2013-10-31
          • 1970-01-01
          相关资源
          最近更新 更多