我有一个班级
class Person{
public string Name {get; set;}
public string Surname {get; set;}
}
和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
绑定到网格中,因此不需要重新绑定myGrid
。
如何在不重新绑定的情况下解决它?
答案 0 :(得分:154)
列表未实现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;
答案 1 :(得分:3)
每次向List添加新元素时,都需要重新绑定Grid。 类似的东西:
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;
答案 2 :(得分:1)
将新项目添加到persons
后添加:
myGrid.DataSource = null;
myGrid.DataSource = persons;
答案 3 :(得分:1)
是的,可以通过实现INotifyPropertyChanged接口来进行重新绑定。
这里有一个非常简单的例子,
http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx
答案 4 :(得分:0)
这不完全是我遇到的问题,但是如果有人希望将任何类型的BindingList转换为相同类型的List,则可以这样做:
var list = bindingList.ToDynamicList();
此外,如果要将动态类型的BindingList分配给DataGridView.DataSource,请确保首先将其声明为IBindingList,以便上面的方法起作用。