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





binding (5)


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;

我上课了

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

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




persons添加新项目后添加:

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



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






最后,有人建议将List包装在一些东西中:

这是正确的方法。 “不必要的罗嗦”是一个不好的方式来看待这一点。 它在写my_team.Players.Count时有明确的含义。 你想要统计球员。

my_team.Count

没有任何意义。 算什么?

一个团队不是一个清单 - 不仅仅是一个球员列表。 一个球队拥有球员,所以球员应该成为球员的一部分(一名成员)。

如果你真的担心它过于冗长,你可以随时暴露团队的属性:

public int PlayerCount {
    get {
        return Players.Count;
    }
}

成为:

my_team.PlayerCount

这现在有意义并遵守得墨忒耳定律

您还应该考虑遵守复合重用原则 。 通过继承List<T> ,你说的是一个团队是一个球员列表,并暴露出不必要的方法。 这是不正确的 - 正如你所说的,一个团队不仅仅是一个球员名单:它有一个名字,经理,董事会成员,培训师,医务人员,工资帽等等。通过让你的团队级别包含一个球员名单,你'说一支球队有一份球员名单',但它也可以有其他的东西。





c# list datagridview binding grid