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

时间:2012-02-18 12:57:57

标签: c# winforms datagridview generic-list temporary

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

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

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;
   }
}

非常感谢!这个问题让我很满意。

3 个答案:

答案 0 :(得分:2)

您可以使用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>,其中至少定义了一个对象,这样网格就可以理解列的内容并创建它们。

答案 1 :(得分:1)

如果您按照自己的方式使用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;

这会使用List

中的当前数据刷新datagridview

使用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" });
}

答案 2 :(得分:0)

使用ObservableCollection<T>代替列表