0

我在Windows窗體中有一個數據綁定問題。如何將主窗口中的WinForms'DataGridView綁定到EF導航屬性(集合)?

這裏的EF模型的一部分是相關的故事:

namespace Model 
{ 
    class Person 
    { 
     [Key] 
     public int Id { get; set; } 

     public String Name { get; set; } 

     public virtual ICollection<Receipt> Receipts { get; set; } 
    } 

    class Receipt 
    { 
     [Key] 
     public int Id { get; set; } 

     public DateTime Timestamp { get; set; } 
     public double Value { get; set; } 

     public int PersonId { get; set; } 
     public virtual Person Person { get; set; } 
    } 
} 

有一個名爲BindingSource的被設置爲Model.PersonpeopleBindingSource。在後面的代碼,我這樣做:

db.People.Include(p => p.Receipts).Load(); 
peopleBindingSource.DataSource = db.People.Local.ToBindingList(); 

文本框有其數據綁定設置爲peopleBindingSource爲DataSource和Name作爲屬性。

當我運行應用程序時,綁定導航器正常工作,顯示不同的人,因爲我點擊上一個和下一個按鈕。帶有人名的文本框也正確填充。

現在,來這裏的問題:

在相同的形式,有一個DataGridView。我想顯示一行爲每個當前選定的收據人。

我試圖綁定dataGridView's DataSourceReceipts導航屬性peopleBindingSource

我曾預計,gridview將更新其DataSource到相應的收據集合,就像文本框在導航更改時更新其Text屬性一樣。該設置基本相同。

事情是,沒有錯誤拋出,並且網格仍然是空的(它甚至不創建列標題)。

爲什麼不能使用這個綁定工作,並且這可以從設計器內部完成?如何正確設置綁定(沒有以編程方式處理peopleBindingSource上的change事件並從peopleBindingSource.Current中手動設置網格的DataSource)?

+0

你可以發佈代碼將數據源綁定到datagridview的代碼嗎? – stefankmitph

+0

我不能因爲我沒有在代碼中綁定它,而是在設計器中綁定它。但是,我發現問題是什麼。 –

回答

0

我找到了解決問題的辦法。

問題是DataGridView無法綁定到ICollection<Receipt>所以解決方法是將導航屬性更改爲BindingList<Receipt>。然後設計師正確地顯示了該屬性。