代码之家  ›  专栏  ›  技术社区  ›  Matthias Meid

在DataGridView中更新多个选定的INofityPropertyChange对象

  •  1
  • Matthias Meid  · 技术社区  · 17 年前

    我在和一家公司合作 DataGridView (Windows Forms) 已启用MultiSelect,并将其放置在用户控件中。我希望通过调用实现以下代码的公共方法,从用户控件外部更新所有选定的行:

    foreach(DataGridViewRow dr in dataGridView.SelectedRows)
    {
        MyBusiness business = (MyBusiness)dr.DataBoundItem;
        business.Rating = 5;
    }
    

    DataGridViewRow 立即刷新,即上次选择的。底层对象将被更改,并触发NotifyPropertyChange事件。此外,当我在更新后更改选择时,我看到所有行都按照我希望的方式立即更新。

    Rating

    我的业务对象如下所示(当然明显缩短):

    public class MyBusiness : INotifyPropertyChanged
    {
        private int _rating;
        public int Rating
        {
            get { return _rating; }
            set
            {
                if(_rating != value)
                {
                    _rating = value;
                    NotifyPropertyChanged("Rating");
                }
            }
        }
    
        #region INotifyPropertyChanged Members
        public event PropertyChangedEventHandler PropertyChanged;
    
        private void NotifyPropertyChanged(string propertyName)
        {
            if(PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
        #endregion
    }
    

    有没有人也注意到这种行为,甚至知道解决方案(或变通方法)?

    1 回复  |  直到 11 年前
        1
  •  2
  •   Mark Foreman    17 年前

    如果DGV绑定到常规列表,则它仅订阅当前选定行的PropertyChanged事件。请尝试改用BindingList,或为每个更改的项调用BindingSource.ResetItem(n)。

    MSDN gives an example 它使用BindingList并(无意义地)调用ResetItem。播放他们的示例,您可以看到删除对ResetItem的调用,或者用regualr列表替换BindingList<&燃气轮机;将按预期运行。

    推荐文章