将List <T>绑定到WinForm中的DataGridView

nam*_*mco 85 c# grid binding datagridview list

我上课了

class Person{
      public string Name {get; set;}
      public string Surname {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

没有问题.myGrid显示两行,但是当我向persons列表中添加新项目时,myGrid不会显示新的更新列表.它只显示我之前添加的两行.

那么问题是什么?

每次重新绑定都很有效.但是当我DataTable每次进行一些更改时都绑定到网格时,DataTable没有任何ReBind需要myGrid.

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

Jür*_*ock 164

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

将DataGridView绑定到一个BindingList<T>.

var list = new BindingList<Person>(persons);
myGrid.DataSource = list;
Run Code Online (Sandbox Code Playgroud)

但我甚至会进一步将你的网格绑定到一个 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;
Run Code Online (Sandbox Code Playgroud)

  • 为什么你使用BindingList和BindingSource,因为我们可以直接将list绑定到datagridview数据源属性.讨论你在这里使用的BindingList和BindingSource的重要性.谢谢 (5认同)
  • @Pacane:当然可以,但DataGridView需要知道你的数据源是否有任何变化.`one`方式是使用BindingList,如果基础列表发生变化,它将引发一个事件.另一种方法是每次添加/删除一行时使用`BindingSource`并调用ResetBinding(),但这样做更多.如果要通知Grid有关属性更改的最简单方法是实现`INotifyPropertyChanged` (4认同)
  • @CraigBrett 将“BindingSource”视为数据源和 GUI 之间的桥梁。它解决了许多与数据绑定相关的问题。您想重新加载数据吗?只需将`bindingSource.DataSource` 设置为您的新集合,而不是重新绑定每个控件。你的数据源可以为空吗?Set `bindingSource.DataSource = typeof(YourClass)` 你想要一个可编辑的网格,但你的数据源没有一个无参数的构造函数?只需实现`bindingSource.AddingNew` 事件并自己创建对象。我在使用 BindingSource 时从未遇到过缺点,但有很多好处。 (4认同)
  • @Mou如果需要,可以将DataGrid绑定到`List &lt;T&gt;`。但是,如果您以编程方式向列表中添加项目,则DataGridView不会知道它,因为您的列表不会使IBindingList失效。关于BindingSource:我经常使用Winforms,除了BindingSource-FULLSTOP,我不绑定任何其他东西。添加更多细节对于评论来说太多了,但是BindingSource可以提供很多好处而没有任何缺点。我会走得很远,说“不使用BindingSource进行绑定的任何人都没有完全理解Windows窗体数据绑定”。 (2认同)

Dim*_*rov 5

每次向列表添加新元素时,都需要重新绑定网格。就像是:

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;
Run Code Online (Sandbox Code Playgroud)