如何在绑定到链接到EF4实体的绑定源时对DataGridView进行排序

我有一个链接到BindingSourceDataGridView

我的BindingSource链接到一个IQueryable实体列表:

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

我希望我的用户能够点击网格标题来对数据进行排序 – 努力使其发挥作用。 可能吗? 如果是这样,我该怎么办?

我最近在同样的问题上苦苦挣扎; 似乎IQueryable接口没有为DataViewGrid提供足够的信息来知道如何自动排序数据; 所以你必须使用它可以使用的东西或者我做的事情从Entity源重新打包你的集合并手动处理排序function:

  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; } 

我希望有所帮助。

VB.NET

如果您使用带有linq语法的bindingsource,您可以像这样对数据进行排序

在这种情况下,从entity framework对象“NCFile”加载与datagridview关联的绑定源时,将外部列添加到“NCFilePartSet”列表中

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

或者像这样

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

其中“Sort”是NCFilePartSet中的一列

实体更新继续工作并反映回数据库

是的,绑定到EF数据时可以轻松获得可排序的DGV。 使用BLW库中的BindingListView (另外,请查看如何实现DataGridView的自动排序? )。

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

在我的测试中,即使在构造函数中调用.ToList() (如上所述),更改也会传播到数据库,这让我感到惊讶。

此代码段效果非常好,并且对于大多数用途来说足够快……

 int iColNumber = 3; //eg, sorting on the 3rd column of the DGV MyBindingSource.DataSource = MyBindingList.OrderByDescending(o => o.GetType().GetProperty(MyDataGridView.Columns[iColNumber].Name).GetValue(o));