Обновление нескольких выбранных объектов INofityPropertyChange в DataGridView

Я работаю с DataGridView (Windows Forms)< /a> с включенным MultiSelect, который помещается в пользовательский элемент управления. Я хотел бы обновить все выбранные строки из-за пределов пользовательского элемента управления, вызвав общедоступный метод, реализующий следующий код:

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

К сожалению, когда выбрано несколько строк, немедленно обновляется только одна DataGridViewRow, а именно та, которая была выбрана последней. Базовые объекты изменяются, и запускается событие NotifyPropertyChange. Более того, когда я меняю выбор после обновления, я вижу, что все строки обновляются точно так, как я хотел бы, чтобы они были немедленно.

Во-вторых, очень странно: когда я устанавливаю точку останова в Setter свойства Rating, где срабатывает NotifyPropertyChange, и жду там несколько секунд, прежде чем продолжить выполнение кода, все работает хорошо (все строки сразу обновляются). Если я не жду, а очень быстро нажимаю 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
}

Кто-нибудь уже заметил это поведение или даже знает решение (или обходной путь)?


person Matthias Meid    schedule 03.03.2009    source источник


Ответы (1)


Если ваш DGV привязан к обычному списку, он подписывается только на событие PropertyChanged для текущей выбранной строки. Вместо этого попробуйте использовать BindingList или вызовите BindingSource.ResetItem(n) для каждого измененного элемента.

MSDN приводит пример, который использует BindingList, а также (бессмысленно) вызывает СброситьЭлемент. Поиграйте с их примером, и вы увидите, что либо удаление вызова ResetItem, либо замена BindingList обычным List‹> будет работать так, как задумано.

person Mark Foreman    schedule 10.06.2009