DataGridView, связанный с BindingList, не обновляется при изменении значения - PullRequest
17 голосов
/ 27 июля 2010

У меня есть DataGridView, связанный с BindingList (C # Windows Forms). Если я изменю одно из значений в элементе списка, оно не сразу появится в сетке. Если я щелкну по измененной ячейке или сверну ее, разверните окно, чтобы оно обновлялось правильно, но мне нужно, чтобы это происходило автоматически.

У меня раньше была такая же проблема, но в этой ситуации мне приходилось менять цвет фона ячейки одновременно с изменением значения. Это привело к правильному обновлению ячейки.

Единственный способ заставить его работать - это ...

dataGridView.DataSource = null;  
dataGridView.DataSource = myBindingList

... но я бы очень хотел этого избежать, так как полоса прокрутки возвращается наверх и означает, что мне придется снова установить цвета фона моей ячейки. Конечно, есть лучший способ. Я пытался обновить (а также обновить родительский), обновление и Invalidate, но они не делают то, что мне нужно.

Я видел эту проблему, упомянутую на нескольких досках объявлений, но еще не нашел рабочего ответа на нее.

Ответы [ 5 ]

23 голосов
/ 09 августа 2010

ListChanged уведомления об изменениях значения элемента выдаются только в том случае, если тип элемента списка реализует интерфейс INotifyPropertyChanged.

Взято из: http://msdn.microsoft.com/en-us/library/ms132742.aspx

Поэтому мой первый вопрос будет следующим: правильно ли вы реализуете свой предмет INotifyPropertyChanged?

5 голосов
/ 26 марта 2015

Ваш источник данных должен реализовывать INotifyPropertyChanged, чтобы любое изменение в BindingList отражалось в представлении данных.

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;
3 голосов
/ 07 января 2013

Просто звоните myBindingList.ResetBindings() всякий раз, когда ваши данные меняются!

1 голос
/ 09 августа 2010

Звучит так, как будто ваше уведомление об изменении объекта не запускается / обрабатывается неправильно. Лично я всегда использую объект BindingSource при привязке к dataGridView.

Я бы прочитал FAQ по DataGridView и FAQ по привязке данных и поиска уведомления об изменении объекта.

Если вы используете ADO.Net, не забудьте вызвать методы .Validate () и .EndEdit ().

0 голосов
/ 03 сентября 2012
    private void refreshDataGrid()
    {
        dataGridView1.DataSource = typeof(List<>);
        dataGridView1.DataSource = myBindingList;
        dataGridView1.AutoResizeColumns();
        dataGridView1.Refresh();
    }

Затем просто вызывайте метод refreshDataGrid каждый раз, когда в вашем списке происходят изменения.

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