1

我正在使用启用了 MultiSelect 的DataGridView(Windows 窗体),它放置在用户控件中。我想通过调用实现以下代码的公共方法来更新用户控件外部的所有选定行:

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

Unfortunately, when multiple rows are selected, only one DataGridViewRowis immediately refreshed, namely the one that was last selected. 基础对象发生更改,并触发 NotifyPropertyChange 事件。此外,当我在更新后更改选择时,我会看到所有行都按照我希望它们立即更新的方式进行了更新。

第二件事,非常奇怪:当我在Rating触发 NotifyPropertyChange 的 -property 的 Setter 中设置断点并在那里等待几秒钟,然后继续执行代码时,一切正常(所有行都立即更新)。如果我不等待而是在每次通过断点时非常快速地按 F5,我就会得到上面描述的效果。

我的业务对象看起来像这样(当然显着缩短):

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
}

是否有人也已经注意到这种行为,或者甚至知道解决方案(或解决方法)?

4

1 回答 1

2

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

MSDN 给出了一个使用 BindingList 并且(毫无意义地)调用 ResetItem 的示例。使用他们的示例,您可以看到删除对 ResetItem 的调用或将 BindingList 替换为常规 List<> 将按预期运行。

于 2009-06-10T05:16:28.843 回答