将临时数据添加到列表并将其绑定到DataGridView Winform

本文关键字:绑定 DataGridView Winform 列表 数据 添加 | 更新日期: 2023-09-27 18:25:13

我想将临时数据放入一个通用列表中,并将其绑定到datagridview
然而,我只能在datagridview中放一行,我想像数据库一样输入多行。

这是我试过的,请告诉我如何修复。谢谢:)

MyClass
{
   private List<object> _list = new List<object>();;
   public MyClass()
   {
   }
   protected void OnClickButton(object sender, args e)
   {
     _list.Add(new { Name = textBoxName.Text, Gender = genderComboBox.Text });
     dataGridView1.DataSource = _list;
   }
}

非常感谢!我真的被这个问题弄得晕头转向。

将临时数据添加到列表并将其绑定到DataGridView Winform

您可以使用BindingList<object>而不是List<object>,例如:

BindingList<object> bList = new BindingList<object>();
public MyClass()
{
}
private void button1_Click(object sender, EventArgs e)
{
    bList.Add(new { Name = "Foo", Gender = "Bar" });
    dataGridView1.DataSource = bList;
}

代码的问题是向_list添加一个元素,然后将该列表作为网格的数据源传递。第一次一切都很好。下一次它不起作用,因为DataGridView.DataSource属性在内部执行检查,验证传递的对象是否等于(或更好的引用等于)当前对象,以防它什么都不做。

BindingList<T>是有效的,因为它公开了修改列表时报告的事件(由网格内部使用),所以基本上你也可以避免每次都将它传递给DataSource,除了第一次。


顺便说一句,我建议您使用一个特定的类(如@Alex answer中所示),而不是将一个匿名类放在object的列表中。

例如,使用像Person这样的自定义类,可以将空的BindingList<Person>传递给grid.DataSource,然后添加其他Person对象,而不会出现任何问题。

相反,您不能将空的BindingList<object>传递给grid.DataSource,因为这会导致无列网格,因此之后您不能添加任何具有公共属性的元素(因为公共属性变成了列)。因此,您需要传递一个至少定义了一个对象的BindingList<object>,以便网格能够理解列的内容并创建它们。

如果您按自己的方式使用,DataGridView似乎总是需要重置。

public class Person
{
    public String Name { get; set; }
    public String Gender { get; set; }
}
// Your control
private List<Person> _persons = new List<Person>();
// Click Event
dataGridView1.DataSource = null;
_persons.Add(new Person() { Name = "Test", Gender = "Male" });
dataGridView1.DataSource = _persons;

这将使用列表中的当前数据刷新数据网格视图

不过,使用BindingList<T>似乎是合适的方式。(感谢@digEmAll)

private BindingList<Person> _persons = new BindingList<Person>();
// Load Event
dataGridView1.DataSource = _persons;
private void button1_Click(object sender, EventArgs e)
{
    _persons.Add(new Person() { Name = "Test", Gender = "Male" });
}

使用ObservableCollection<T>而不是列出