2011-04-26 32 views
31

我一直在試圖將一個實體框架對象綁定到一個DataGridView,但我一直打到死角,我似乎無法在任何地方找到我的答案。將實體框架對象綁定到Datagridview C#

我可以將整個表(實體)的綁定到一個GridView,它可以讓我做出改變和背部修改保存到數據庫這樣的:

WS_Model.WS_Entities context; 

    private void simpleButton1_Click(object sender, EventArgs e) 
    { 
     context = new WS_Entities(); 

     var query = from c in context.Users select c; 

     var users = query.ToList(); 

     gridControl1.DataSource = users; 
    } 

    private void simpleButton2_Click(object sender, EventArgs e) 
    { 
     context.SaveChanges(); 
    } 

,但我不希望看到所有在我的數據庫表在我的DataGridView列,所以我試圖做這樣的......

WS_Entities context = new WS_Entities(); 

    private void simpleButton1_Click(object sender, EventArgs e) 
    { 
     var query = from c in context.Users 
        where c.UserName == "James" 
        select new { c.UserName, c.Password, c.Description }; 

     var results = query.ToList(); 

     gridControl1.DataSource = results; 
    } 

    private void simpleButton2_Click(object sender, EventArgs e) 
    { 
     context.SaveChanges(); 
    } 

,但現在我不能在我的DataGridView編輯任何數據。

我不能在這裏看到樹木 - 請有人介意指出我的方式錯誤,或者告訴我什麼是用Winforms綁定EF的最佳做法,因爲我正在獲得人才流失。

我可以看到它是一個與部分做:

select new { c.UserName, c.Password, c.Description } 

但我不知道爲什麼。

+0

[祝你好運。](http://stackoverflow.com/questions/5070990) – 2011-04-26 18:07:31

回答

38

與行的問題:

select new { c.UserName, c.Password, c.Description } 

是,它是創建一個anonymous type,和匿名類型是不可變的 - 這是隻讀的。這就是爲什麼您的更改不會反映在新類型或原始EF對象中。

現在,至於不顯示您綁定的對象的所有列的方法,我已經給出了以下三個選項。

隱藏不需要的列

最直接的方法是設置Visible屬性爲false,你不希望顯示的列。

dataGridView1.Columns[0].Visible = false; 

其中Columns集合索引器中的值可以是指定列位置的整數或列名稱的字符串。在EF

自定義對象的數據綁定這個

你也可以在EF層處理這一點 - 爲您創造結合其EF從數據庫映射沒有你不想要的列的自定義對象。我還沒有真正使用過EF 4.0,但我知道它現在具有這種功能。

自定義DTO從EF對象投射,然後映射回

第三個選項(這些是從好到壞,我對他們的看法去,但我想我會告訴你幾個方法!)是查詢一個具體的類型,然後映射回EF對象。例如:

private class DataBindingProjection 
{ 
    public string UserName { get; set; }; 
    public string Password { get; set; }; 
    public string Description { get; set; }; 
} 

private void simpleButton1_Click(object sender, EventArgs e) 
{ 
    context = new WS_Entities(); 
    var query = from c in context.Users 
       where c.UserName == "James" 
       select new DataBindingProjection { UserName = c.UserName, Password = c.Password, Description = c.Description }; 
    var users = query.ToList(); 
    gridControl1.DataSource = users; 
} 

private void simpleButton2_Click(object sender, EventArgs e) 
{ 
    // and here you have some code to map the properties back from the 
    // projection objects to your datacontext 

    context.SaveChanges(); 
} 

在某些情況下,這也可能是一個可行的解決方案...

+1

嗨大衛 - 我曾考慮隱藏方法,但希望有一個更清潔的解決方案。謝謝你的回答 – 2011-04-27 21:38:24

+1

@David Hall:哈特!謝謝 – CloudyMarble 2012-06-20 06:46:58

+2

@David Hall:你將如何將這個解決方案轉換爲用於MVVM?我試圖將其加入到ObservableCollection中,以便通知PropertyChanged事件。謝謝! – Rachael 2013-03-13 02:18:50