4

有幾個關於此的帖子,但經過幾個小時的搜索,我仍然無法找到我所需要的。將數據綁定列數據綁定到每行datagridview(不是整列)

在以下職位的回答幾乎讓我什麼,我想: Combobox for Foreign Key in DataGridView

問題1:

去關閉該例子,其中一個產品有很多許可證,我的數據庫映射都是多對一這意味着我的許可證類擁有對產品類的引用。該License類沒有ProductId的屬性,因爲可以通過產品參考獲取該屬性。我不想用引用Product和ProductId屬性的方法來清理許可證類,以便更容易地在UI中進行綁定。

因此,我無法將DataPropertyName設置爲Id字段。它需要的類引用名字,像這樣:

DataGridViewComboBoxColumn dataGridViewComboBoxColumn = 
(DataGridViewComboBoxColumn)myDataGridView.Columns("LicenseComboBoxColumn"); 

dataGridViewComboBoxColumn.DataPropertyName = "License"; // not LicenseID 

**** ****更新我 能得到這個沒有通過指定Product.Id作爲創建產品ID屬性部分工作DataPropertyName像這樣:

dataGridViewComboBoxColumn.DataPropertyName = "License.Id"; 

但是,這樣做的時候,它打破了這引起了我的手工獲取和設置單元格的值數據綁定。

我也看到了帖子關於綁定到DataGridView細胞,但數據綁定符,當我做到這一點,數據源本身從不更新:

// populate the combo box with Products for each License 

foreach (DataGridViewRow row in myDataGridViewProducts.Rows) 
{ 
    IProduct myProduct = row.DataBoundItem as IProduct; 
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells("myProductCol"); 
    cell.DataSource = getListOfILicenseObjectsFromDao(myProduct.Id); 
    cell.Value = myProduct.License.Id; 
} 

也許我做錯了什麼,或者也許有一種不同的方式。任何人都可以幫忙嗎?

問題2:

如何顯示牌照爲每個產品不同的名單? 換句話說,對於網格中的每個產品,許可證的組合框列表將不同。我想用數據綁定來完成這個工作,所以我不必親自去設置這些值。

回答

4

我自己找到了答案。前一段時間我遇到了同樣的問題,並在我挖出的一些舊代碼中找到了解決方案。解決的辦法是增加一個自屬性我想數據綁定到在組合框(在上面的例子中這將是許可類)的對象,並使用該屬性作爲ValueMember像這樣:

foreach (DataGridViewRow row in myDataGridViewProducts.Rows) 
{ 
    IProduct myProduct = row.DataBoundItem as IProduct; 
    DataGridViewComboBoxCell cell = (DataGridViewComboBoxCell)row.Cells("myProductCol"); 
    cell.DataSource = getListOfILicenseObjectsFromDao(myProduct.Id); 
    cell.DataPropertyName = "License";   
    cell.DisplayMember = "Name"; 
    cell.ValueMember = "Self"; // key to getting the databinding to work 
    // no need to set cell.Value anymore! 
} 

許可證類現在看起來是這樣的:

Public class License 
{ 
    public string Name 
    { 
     get; set; 
    } 

    public ILicense Self 
    { 
     get { return this; } 
    } 

    // ... more properties 
} 

授予我不得不「糞」了商務類與屬性命名的自我,但是這不是既具有參考執照和一個更好的(容易混淆的程序員)產品類IMO中的LicenseId屬性。此外,它使UI代碼更加簡單,因爲不需要手動獲取和設置值 - 只需綁定數據並完成即可。