DataGridView, привязанный к BindingList, не обновляется при изменении значения
У меня есть DataGridView, связанный с BindingList (С# Windows Forms). Если я изменяю одно из значений в элементе списка, оно не появляется сразу в сетке. Если я нажму на измененную ячейку или скрою, увеличьте окно, которое оно обновит правильно, но мне нужно, чтобы это произошло автоматически.
У меня была такая же проблема раньше, но в этой ситуации мне пришлось изменить цвет фона ячейки одновременно с изменением значения. Это заставило ячейку правильно обновиться.
Единственный способ заставить его работать...
dataGridView.DataSource = null;
dataGridView.DataSource = myBindingList
... но я действительно хотел бы избежать этого, поскольку он заставляет панель прокрутки вернуться к вершине и означает, что мне придется снова установить цвета фона на ячейке. Конечно, лучший способ. Я попытался обновить (а также обновить родительский элемент), Update и Invalidate, но они не делают то, что мне нужно.
Я видел эту проблему, упомянутую на нескольких досках объявлений, но пока не видел рабочего ответа.
Ответы
Ответ 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;
Ответ 3
Вот учебник по привязке DataGridView к коллекции - INotifyPropertyChanged
http://www.switchonthecode.com/tutorials/csharp-tutorial-binding-a-datagridview-to-a-collection
Ответ 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 в любое время, когда произойдут изменения в вашем списке.