如何在绑定到链接到EF4实体的绑定源时对DataGridView进行排序
我有一个链接到BindingSource
的DataGridView
。
我的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));