C#BindingList <t>作为DataGrid的数据源

时间:2017-01-03 11:22:47

标签: c# datagridview

我一直在使用BindingLists来显示在我的应用程序中运行的Threads的对象数据。 这一直很有效。

现在我想在DataGridView中显示我自己的对象的属性,空BindingList的绑定成功没有问题。 但是,当向列表中添加元素时,我得到一个例外,说明DataGridView

中必须有列

有效的代码:

BindingList<Thread> threads = new BindingList<Thread>();
dgThreadStates.DataSource = new BindingSource() { DataSource = threads }; //DataGridView
Thread t = new Thread(new ParameterizedThreadStart(handler.handleEntries));
threads.Add(t);

然而,这似乎不起作用:

public class Customer
{
    public System.Guid GUID;

    public string FirstName;
    public string MiddleName;
    public string LastName;

    public string Postcode;
    public string HouseNo;
    public string StreetName;
    public string City;
}

方法:

BindingList<Customer> savedCustomers = new BindingList<Customer>();
dgvCustomers.DataSource = new BindingSource() { DataSource = savedCustomers };  //DataGridView
savedCustomers.Add(new Customer());

我会得到这个例外:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Windows.Forms.dll. Additional Information: No row can be added to a DataGridView control that does not have columns. Columns must be added first.

2 个答案:

答案 0 :(得分:1)

数据绑定使用属性而非字段。 DataGridView在您的类中找不到用于生成列的属性(我假设您在网格中使用autocreatecolumns),并且拒绝在没有任何列的情况下工作。

所以你需要用(至少自动)属性替换你的字段。

public class Customer
{
    public System.Guid GUID { get; set; }
    // etc. 
}

答案 1 :(得分:0)

这是可能的解决方案

var list = new List<users>()
{
    new Person { Name = "Robin", },
    new Person { Name = "Cleef", },
};
var bindingList = new BindingList<users>(list);
var source = new BindingSource(bindingList, null);
grid.DataSource = source;