Подтвердить что ты не робот

DataGridView, привязанный к BindingList, не обновляется при изменении значения

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

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

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

dataGridView.DataSource = null;  
dataGridView.DataSource = myBindingList

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

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

4b9b3361

Ответ 1

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

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

Итак, мой первый вопрос: правильно ли ваш элемент INotifyPropertyChanged?

Ответ 2

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

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;

Ответ 4

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

Ответ 5

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

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

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

Ответ 6

    private void refreshDataGrid()
    {
        dataGridView1.DataSource = typeof(List<>);
        dataGridView1.DataSource = myBindingList;
        dataGridView1.AutoResizeColumns();
        dataGridView1.Refresh();
    }

Затем просто вызовите метод refreshDataGrid в любое время, когда произойдут изменения в вашем списке.