web-dev-qa-db-ja.com

List <T>をWinFormのDataGridViewにバインド

クラスがあります

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は2つの行を表示しますが、personsリストに新しい項目を追加すると、myGridには新しい更新されたリストが表示されません。前に追加した2つの行のみが表示されます。

それで問題は何ですか?

毎回再バインドがうまく機能します。ただし、DataTableに変更を加えるたびにDataTableをグリッドにバインドすると、myGridを再バインドする必要がなくなります。

毎回再バインドせずにそれを解決する方法は?

78
namco

リストは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;
155

リストに新しい要素を追加するたびに、グリッドを再バインドする必要があります。何かのようなもの:

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

はい、INotifyPropertyChangedインターフェイスを実装することにより、再バインドを行わなくても可能です。

かなりシンプルな例はこちらから入手できますが、

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

1
Dev

personsに新しいアイテムを追加した後、次を追加します。

myGrid.DataSource = null;
myGrid.DataSource = persons;
1
Rafal