Список привязок <T> к DataGridView в WinForm
У меня есть класс
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
и a List<Person>
, к которым я добавляю некоторые элементы. Список привязан к моему DataGridView
.
List<Person> persons = new List<Person>();
persons.Add(new Person(){Name="Joe", Surname="Black"});
persons.Add(new Person(){Name="Misha", Surname="Kozlov"});
myGrid.DataSource = persons;
Нет проблем. myGrid
отображает две строки, но когда я добавляю новые элементы в список persons
, myGrid
не показывает новый обновленный список. Он показывает только две строки, которые я добавил ранее.
Итак, в чем проблема?
Повторное связывание каждый раз работает хорошо. Но когда я привязываю DataTable
к сетке, когда каждый раз, когда я вношу некоторые изменения в DataTable
, нет необходимости в ReBind myGrid
.
Как его решить, не перебирая каждый раз?
Ответы
Ответ 1
Список не реализует IBindingList
, поэтому сетка не знает о ваших новых элементах.
Привяжите свой DataGridView к BindingList<T>
.
var list = new BindingList<Person>(persons);
myGrid.DataSource = list;
Но я бы даже пошел дальше и привязал вашу сетку к BindingSource
var list = new List<Person>()
{
new Person { Name = "Joe", },
new Person { Name = "Misha", },
};
var bindingList = new BindingList<Person>(list);
var source = new BindingSource(bindingList, null);
grid.DataSource = source;
Ответ 2
Каждый раз, когда вы добавляете новый элемент в список, вам нужно повторно привязать свою сетку.
Что-то вроде:
List<Person> persons = new List<Person>();
persons.Add(new Person() { Name = "Joe", Surname = "Black" });
persons.Add(new Person() { Name = "Misha", Surname = "Kozlov" });
dataGridView1.DataSource = persons;
// added a new item
persons.Add(new Person() { Name = "John", Surname = "Doe" });
// bind to the updated source
dataGridView1.DataSource = persons;
Ответ 3
После добавления нового элемента в persons
добавьте:
myGrid.DataSource = null;
myGrid.DataSource = persons;
Ответ 4
Да, с помощью интерфейса INotifyPropertyChanged можно сделать это без перезаписи.
Довольно простой пример доступен здесь,
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx