namco
namco

Reputation: 6348

Binding List<T> to DataGridView in WinForm

I have a class

class Person{
      public string Name {get; set;}
      public string Surname {get; set;}
}

and a List<Person> to which I add some items. The list is bound to my 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;

There is no problem. myGrid displays two rows, but when I add new items to my persons list, myGrid does not show new updated list. It only shows the two rows which I added before.

So what is the problem?

Rebinding every time works well. But when I bind a DataTable to the grid when every time when I make some changes to DataTable there is not any need to ReBind myGrid.

How to solve it without rebinding every time?

Upvotes: 116

Views: 312955

Answers (5)

Dan
Dan

Reputation: 61

This isn't exactly the issue I had, but if anyone is looking to convert a BindingList of any type to List of the same type, then this is how it is done:

var list = bindingList.ToDynamicList();

Also, if you're assigning BindingLists of dynamic types to a DataGridView.DataSource, then make sure you declare it first as IBindingList so the above works.

Upvotes: 0

J&#252;rgen Steinblock
J&#252;rgen Steinblock

Reputation: 31743

List does not implement IBindingList so the grid does not know about your new items.

Bind your DataGridView to a BindingList<T> instead.

var list = new BindingList<Person>(persons);
myGrid.DataSource = list;

But I would even go further and bind your grid to a 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;

Upvotes: 230

Dev
Dev

Reputation: 1020

Yes, it is possible to do with out rebinding by implementing INotifyPropertyChanged Interface.

Pretty Simple example is available here,

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

Upvotes: 4

Rafal
Rafal

Reputation: 1091

After adding new item to persons add:

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

Upvotes: 0

Dimitar Dimitrov
Dimitar Dimitrov

Reputation: 15158

Every time you add a new element to the List you need to re-bind your Grid. Something like:

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;

Upvotes: 5

Related Questions