Обновление нескольких выбранных объектов INofityPropertyChange в DataGridView - PullRequest
1 голос
/ 03 марта 2009

Я работаю с DataGridView (Windows Forms) с включенным 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
}

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

1 Ответ

2 голосов
/ 10 июня 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...