0

我使用实体框架。当我将实体集绑定到标准 DataGridView 控件时,我失去了按标题排序的功能。我什至尝试先将实体集绑定到绑定源,但结果是一样的。

此外,如果我尝试从代码中对列进行排序,我什至会得到一个接口未实现的异常......标准 EF 类是否不可排序(会很糟糕)?不用说,如果提供 DataView 作为数据源,则排序工作。

我怎么能解决这个问题?谢谢。

4

1 回答 1

0

派对迟到了,但我想我至少会发布一个答案......有两种方法可以轻松实现这一点(实际上是相同的方法,只是路线略有不同)。

所以我们有一个基本的 EF 上下文查询,预执行。

var query = context.Projects
    .Where(x => x.Division == selectedDivision);

加载查询,使实体位于本地缓存中。然后将 DGV 的绑定源指向本地缓存的同步 BindingList

query.Load();
projectBindingSource.DataSource = context.Projects.Local.ToBindingList(); 

或者......有时我不想/不需要更改跟踪或缓存“妨碍”其他操作,所以我需要一个非跟踪集合。

在不跟踪的情况下执行查询并将其结果加载到 ObservableCollection (这就是 .Local )。将 DGV 的绑定源指向 ObservableCollection 的同步 BindingList

var locs = new ObservableCollection<Location>(query.AsNoTracking().ToList());
locationBindingSource.DataSource = locs.ToBindingList();

所有文本、数字和布尔列都将启用对标题单击的排序。导航属性的列不会排序:假设一个项目有一个所有者导航属性,因为我有所有者实体的 ToString() 覆盖显示 Owner.FullName 属性我将看到一个具有 FullName 值的所有者列,但我假设排序器仍然将列的类型视为 System.Data.Entity 对象(而不是显示的冒泡文本),因此没有默认的排序器。

于 2013-02-14T17:25:21.960 回答