2010-02-13 149 views
7

我有一個包含兩個表,產品和許可證的數據庫。 Licences.ProductIDProducts.ProductID有外鍵引用(即該產品的許可證)。DataGridView中的外鍵Combobox

如何在WinForms DataGridView中表示該關係?

當向DataGridView(SQL Metal和LINQ to SQL),ProductLicences.ProductID提供時,它會自動生成一個帶有期望產品的文本字段的列(當然,我無法輸入......) 。

如何更改此列以包含列出可用產品的組合框?


我有一個連接(從Linq.DataContext繼承),分配到DataGridView數據源是一個Link.IQueryable,因爲這樣產生的:

var ds = from c in m_connection.Licences 
    select c; 

回答

11

在這種情況下,行爲你正在試圖模仿是一個查找組合。你不想使用License類的Product字段,你實際上想要使用ProductID字段。

下面就讓我們一步一步:

  1. 刪除在網格中Product列;只保留ProductID

  2. 更改ProductID列的ColumnType屬性DataGridViewComboBoxColumn

  3. 更改此列的DataSource到一個新的BindingSource設置爲MyProject.ProductDataSource(你可以按照嚮導,可能你做到了網格本身的方式相同,但使用Product代替License)。

  4. 將此列的DisplayMember更改爲您要在組合框中顯示的任何文本,例如ProductName

  5. ValueMember更改爲實際的主鍵,如ProductID

  6. 以前填充GridView本身,初始化新productsBindingSource產品數據,即與productBindingSource.DataSource = context.Products;

就是這樣。現在,當您使用SubmitChanges(假設您一直保持DataContext的打開狀態),它將使用正確的參考更新ProductID。請注意,它可能不會更新它保存的類的Product引用;如果您因任何原因需要使用實際的實體引用,那麼您可能需要首先調用DataContext.Refresh方法。但不要擔心,除非你需要在網格外使用實體類。

+0

謝謝!這工作得很好。 – peterchen 2010-02-16 11:54:09

+0

如果許可證類只有產品字段而不是產品ID字段,該怎麼辦?(您不應該添加一個額外的ProductID字段,僅用於UI綁定的目的)IMO – 2011-05-09 15:47:56

+0

@goku:呃......如果天空隕落怎麼辦?在問題中指定該字段存在,並且它也是Linq to SQL的顯式行爲(也在問題中指定)。 – Aaronaught 2011-05-09 15:55:48