2014-09-04 28 views
1

我有3個實體編碼到我的應用程序: 賬戶,產品,採購問題從EF POCO外鍵對象綁定到WinForm控件

購買對象擁有一個賬號和一個產品,那麼其他一些標準數據類型(收入,日期,數量等)

[System.Data.Linq.Mapping.Table(Name = "Purchases")] 
public class Purchase 
{ 
    [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    public long PurchaseId { get; set; } 

    public Account Account { get; set; } 

    public Product Product { get; set; } 

    public DateTime PurchaseDate { get; set; } 

    public decimal Revenue { get; set; } 

    public long Quantity { get; set; } 
} 

賬戶對象具有一個ObservableCollection,我預想訪問購買和結合到控制是這樣的:

Account acct = db.Accounts.First(a => a.AccountId == 1); 

this.dataGridView1.DataSource = acct.Purchases.ToBindingList(); 

唯一的問題是帳戶和產品的DataGrid列未按預期填充。我得到一個奇怪的代理版本的帳戶,並且產品是空白的。請看下圖:

DataGridPng

1)什麼我需要做的,使帳戶列都將填充該帳戶ID和產品列獲得產品編號(或更好,但不同的性質類似產品名稱)?

2)它看起來像使用.ToBindingList()(這裏演示http://msdn.microsoft.com/en-us/data/jj682076.aspx)的EF對象與控件的直接綁定非常有限。例如,你可以綁定某些列並排除其他列嗎?當您使用聚合其他對象的對象時,這種情況怎麼樣?我見過的大部分數據綁定示例都非常基本,我不確定這種方法是否能夠滿足我的要求。你有任何建議/資源複雜的控制綁定?

回答

1

您可以覆蓋相關實體上的ToString方法,可以在部分類中或在主類中。您可以使用Select來選擇要顯示的列。

var purchases = acct.Purchases.Select(p => new 
{ 
    p.PurchaseId, 
    Account = p.Account.AccountName, 
    Product = p.Product.ProductName, 
    p.PurchaseDate 
}); 
var source = new ObservableCollection<object>(purchases).ToBindingList(); 
this.dataGridView1.DataSource = source; 
+1

我最終找到了一個這種方法的例子,它工作得很好。我對平臺很陌生,本教程未提及此選項。可能是因爲匿名類型無法寫入。但是,爲了我的需要,這非常完美。 – wesmantooth 2014-09-05 16:20:33