2017-01-03 60 views
1

我一直在使用BindingLists來顯示在我的應用程序中運行的線程的對象數據。 這一直很好。C#綁定列表<T>作爲DataGrid的數據源

現在我想在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()); 

我會得到THI小號例外:

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

您在您的客戶類中使用字段,但綁定與屬性不是字段一起使用。 – Ralf

+0

@Ralf你是對的!請張貼這個答案,以便我可以標記它。 –

回答

1

數據綁定的工作原理與性能並不領域。 DataGridView不會在您的類中找到用於生成列的屬性(我假定您在網格中使用autocreatecolumns),並拒絕沒有任何列的工作。

所以你需要用(atleast自動)屬性替換你的字段。

public class Customer 
{ 
    public System.Guid GUID { get; set; } 
    // etc. 
} 
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;