簡體   English   中英

綁定列表<T>到 WinForm 中的 DataGridView

[英]Binding List<T> to DataGridView in WinForm

我有一堂課

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

不用每次都重新綁定怎么解決?

List 沒有實現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;

每次向 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;

是的,可以通過實現 INotifyPropertyChanged 接口來避免重新綁定。

非常簡單的例子可以在這里找到,

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

在向persons添加新項目后添加:

myGrid.DataSource = null;
myGrid.DataSource = persons;

這不完全是我遇到的問題,但是如果有人希望將任何類型的 BindingList 轉換為相同類型的 List,那么它是如何完成的:

var list = bindingList.ToDynamicList();

此外,如果您將動態類型的 BindingLists 分配給 DataGridView.DataSource,請確保首先將其聲明為 IBindingList,以便上述工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM