2010-12-16 90 views
18

我有一個鏈接到BindingSourceDataGridView如何將DataGridView綁定到鏈接到EF4實體的綁定源時排序

BindingSource鏈接到實體的IQueryable列表:

public void BindTo(IQueryable elements) 
    { 
     BindingSource source = new BindingSource(); 
     source.DataSource = elements; 

     bindingNavigator1.BindingSource = source; 
     dataGridView1.DataSource = source; 

    } 

我希望我的用戶能夠點擊網格標題對數據 - 努力得到這個工作。可能嗎?如果是這樣,我該怎麼做?

+0

注意:DataGridView似乎是WindowsForms,而不是WPF。只爲那些也希望爲他們的WPF DataGrid排序問題找到解決方案的人。 – OneWorld 2013-01-15 08:24:05

回答

11

我最近在解決這個問題,似乎IQueryable接口不能爲DataViewGrid提供足夠的信息來知道如何自動對數據進行排序;所以你必須無論是從實體源使用的東西它可以使用或做什麼,我沒有和手動處理排序功能重新包裝您的收藏:

 private void myDataGridView_ColumnHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e) 
    { 
    DataGridViewColumn column = myDataGridView.Columns[e.ColumnIndex]; 

    _isSortAscending = (_sortColumn == null || _isSortAscending == false); 

    string direction = _isSortAscending ? "ASC" : "DESC"; 

    myBindingSource.DataSource = _context.MyEntities.OrderBy(
     string.Format("it.{0} {1}", column.DataPropertyName, direction)).ToList(); 

    if (_sortColumn != null) _sortColumn.HeaderCell.SortGlyphDirection = SortOrder.None; 
    column.HeaderCell.SortGlyphDirection = _isSortAscending ? SortOrder.Ascending : SortOrder.Descending; 
    _sortColumn = column; 
    } 

我希望幫助。

+0

有沒有辦法做到這一點,同時允許更新?如果您使用ToList(),您將只能寫入臨時列表,並且如果您不使用ToList,則DataGridView似乎禁用添加記錄,如果它綁定到IOrderedEnumerable ... – 2011-09-17 18:21:50

+1

我意識到我需要調用ObjectQuery.OrderBy,而不是IEnumerable.OrderBy來維護可更新的綁定。 – 2011-09-17 18:48:11

0

VB.NET

如果您使用的LINQ語法的BindingSource可以當裝載有一個DataGridView從實體framwork相關的bindningsource對象「NCFILE數據這樣

在這種情況下進行排序「與具有對外列清單‘NCFilePartSet’

bsFileSections.DataSource = From ncfps In NCFile.NCFilePartSet Order By ncfps.Sort Select ncfps 

或類似這樣的

bsFileSections.DataSource = NCFile.NCFilePartSet.OrderBy(Function(ncfps) ncfps.Sort) 

其中「排序」是NCFilePartSet

更新的實體繼續工作,反映到數據庫中

+2

OP要「讓我的用戶......點擊網格標題來排序數據。」如果您對排序列進行硬編碼,則您的答案有效,但是當用戶想要更改排序列並且不丟失任何已編輯/添加的數據時,如何處理數據綁定?我認爲這是真正的挑戰。 – Pat 2013-07-11 14:42:08

0

是的,這可以輕鬆擁有一個可排序的DGV時勢必EF數據。使用BLW library中的BindingListView(同樣,請查看How do I implement automatic sorting of DataGridView?)。

public void BindTo(IQueryable elements) 
{ 
    BindingSource source = new BindingSource(); 
    source.DataSource = new BindingListView(elements.ToList()); 

    bindingNavigator1.BindingSource = source; 
    dataGridView1.DataSource = source; 

} 

在我的測試,即使.ToList()被構造(如上)中調用,變化傳播到數據庫,這讓我吃驚。