2009-09-23 34 views
0

我希望有一個簡單的答案,我已經錯過了幾個小時的谷歌搜索...帶有排序實體集的Datagridview <T>? (.NET 3.5)

我有一個DataGridView需要顯示和添加/刪除/編輯記錄數據庫。我正在使用實體框架,所以記錄最初是EntitySet。

  • 嘗試一個

的BindingSource有分類設施,但哦......他們似乎並不實際獲得,如果你的數據源是一個EntitySet的。

  • 嘗試兩個

嘗試並實現自定義的網格上的排序,但哦...如果網格是數據綁定自定義排序不允許的。

  • 嘗試三

在[執行我的數據LINQ查詢並使用高階函數存在。這工作得到我的訂單數據,但哦......它改變了AllowNew爲false。我可以強制它回來,但添加到DataGridView的記錄不會被添加到我的EntitySet中(儘管怪異地反映了任何更新)。

  • 嘗試四

按#3,但現在我辦理了的BindingSource的AddingNew事件,並明確創建我的對象,並將其添加到EntitySet的。然後這工作,除非如果用戶在網格的底部輸入新的條目行,我得到一行充滿了添加到我的數據庫的默認值。如果用戶繼續輸入行,我會得到很多行。所以這也不好。

一定有辦法做到這一點 - 當然要在網格中顯示一些數據庫記錄,並且允許完全編輯是最基本的要求(並且沒有太大的用處,以隨機順序顯示行)?

任何幫助最感激地接受......

回答

0

我仍然會歡迎這樣做的更好的辦法任何建議,但下面似乎是爲我工作。

我創建了BindingList的派生函數來包裝我的LINQ返回的記錄,然後傳遞ObjectContext和EntityCollection。它覆蓋了AddNewCore和CancelNew,將對象放入數據庫以及BindingList中,如果將焦點移動到底部行但不寫任何東西,它似乎會保留更改,而不會出現不需要的空白行。隨後的

class LinqEntityBinding<T> : System.ComponentModel.BindingList<T> 
    where T : System.Data.Objects.DataClasses.EntityObject 
{ 
    public LinqEntityBinding(
     System.Data.Objects.ObjectContext context, 
     System.Data.Objects.DataClasses.EntityCollection<T> collection, 
     IList<T> list) 
     : base(list) 
    { 
     _context = context; 
     _collection = collection; 
    } 
    System.Data.Objects.ObjectContext _context; 
    System.Data.Objects.DataClasses.EntityCollection<T> _collection; 

    protected override object AddNewCore() 
    { 
     object obj = base.AddNewCore(); 
     _collection.Add((T)obj); 
     return obj; 
    } 

    public override void CancelNew(int itemIndex) 
    { 
     object obj = Items[itemIndex]; 
     _collection.Remove((T)obj); 
     if (((T)obj).EntityState != System.Data.EntityState.Detached) 
     { 
      _context.DeleteObject(obj); 
     } 
     base.CancelNew(itemIndex); 
    } 
} 

代替:

bindingSource.DataSource = customer.Widgets; // unsorted 

我:

bindingSource.DataSource = 
    new LinqEntityBinding<Widget>(db, customer.Widgets, 
    customer.Widgets.OrderBy(w => w.widgetness).ToList()); // sorted