100

我有一堂课

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

如何在不每次重新绑定的情况下解决它?

4

5 回答 5

207

列表未实现IBindingList,因此网格不知道您的新项目。

将您的 DataGridView 绑定到 a 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;
于 2013-05-22T15:36:38.410 回答
4

每次向 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;
于 2013-05-22T15:34:18.877 回答
3

是的,可以通过实现 INotifyPropertyChanged 接口来避免重新绑定。

非常简单的例子可以在这里找到,

http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspx

于 2013-05-22T16:36:49.373 回答
0

添加新项目后persons添加:

myGrid.DataSource = null;
myGrid.DataSource = persons;
于 2013-05-22T15:36:26.280 回答
0

这不完全是我遇到的问题,但是如果有人希望将任何类型的 BindingList 转换为相同类型的 List,那么它就是这样做的:

var list = bindingList.ToDynamicList();

此外,如果您将动态类型的 BindingLists 分配给 DataGridView.DataSource,请确保首先将其声明为 IBindingList,以便上述工作。

于 2020-05-06T11:44:26.063 回答