我一直在使用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.
答案 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;