2012-02-18 103 views
0

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

这是我试过的,请告诉我如何解决它。谢谢:))

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

非常感谢!我真的很担心这个问题。

+0

那么,你只添加了1个项目的列表 - 你试过添加另一个? – Alex 2012-02-18 13:00:33

+0

@alex我只能添加一次。如果我再次单击该按钮,则什么都不会发生,:/ – 2012-02-18 13:03:19

回答

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>,以便网格可以理解列的内容并创建它们。

+0

非常感谢您先生解释和回答我的问题。 :)) – 2012-02-18 13:50:55

+0

@rjtubera:不客气。我刚刚添加了一个关于为什么自定义类优于匿名类的解释,如果您有兴趣。 – digEmAll 2012-02-18 16:06:03

0

使用ObservableCollection<T>,而不是名单

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; 

这将刷新当前数据在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" }); 
} 
相关问题