按一系列属性

时间:2016-06-13 18:16:29

标签: c# winforms entity-framework sorting datagridview

这个问题已被提出很多问题(我知道)但是我无法实现对我有用的东西。

我正在使用Entity Framework来处理与WinForms应用程序的数据交互(并且对于上下文有点新);这很好用,意味着任何DataGridView控件的DataSource都是一个对象列表。

用户可以对多列进行排序。对于没有DataSource的DataGridView控件(因为它们单向并且我已经直接从数据库中提取数据)这不是问题,因为自定义IComparer类处理此排序

但是,我似乎无法对DataSource的网格进行排序,其中DataSource是一组多个列的对象。

需要注意的重要一点是,DataGridView的DataSource可以是任何类型的对象列表(客户,食谱,汽车等),因为网格可以表示来自数据库中任何表的数据通过对象。

我获取DataGridView控件的DataSource的方式如下(此示例适用于系统中的用户):

dtgUserList.pFormGrid.DataEntityProvider.USER_LIST
                    .Where(X => X.USER_ID > 1)
                    .Load();

dtgUserList.pFormGrid.DataSource = dtgUserList.pFormGrid.DataEntityProvider.USER_LIST.Local.ToBindingList();

当DataGridView的DataSource是直接数据库查询的DataTable时,我可以简单地将DataSource DataGridView转换为BindingSource,然后设置Sort属性是排序字符串。例如,如果按USER_NAME排序用户列表,然后按PROFILE排序,则排序如下:

((BindingSource)DataSource).Sort = SortArgs;

SortArgs =" USER_NAME ASC,PROFILE ASC"。这可以通过迭代已排序的列并提取并连接列的DataPropertyName来确定。

如果我尝试转换绑定到上面DataSource个对象的DataGridView控件的USER_LIST,我得到一个编译时错误,表明无法执行转换。

为了尝试解决这个问题,我正在从现有的BindingSource创建一个新的DataSource,然后尝试应用相同的排序逻辑(仅创建排序字符串,然后将其传递给Sort的{​​{1}}属性:

BindingSource

不幸的是,当我执行此操作时,BindingSource GridBindingSource = new BindingSource(DataSource, null); SortedGridBinding.Sort = SortArgs; 属性始终为SupportsAdvancedSorting,尽管false实施BindingSourceMSDN文章中对此进行了说明这个属性。

我主要想了解的是为什么此属性始终设置为IBindingListView,尽管我使用的类实现了所需的接口以允许多列排序。我还看到了一些关于如何通过多个属性实现对象列表排序的示例,例如this example,除非我误解了某些内容,否则这仍然依赖于强类型的IList输入。

1 个答案:

答案 0 :(得分:2)

作为一个选项,您可以为项目添加System.Linq.Dynamic引用,然后在使用System.Linq.Dynamic命名空间后,您可以通过传递排序对IEnumerable<T>IQueryable<T>进行排序列和排序顺序为string,例如:

var list = db.Products.ToList();
bindingSource1.DataSource = list.OrderBy("Name ASC, Price DESC").ToList();

<强>资源

  • NuGet package代表System.Linq.Dynamic。您只需在程序包管理器控制台中使用此命令安装程序包:Install-Package System.Linq.Dynamic

  • {li>

    GitHub repository System.Linq.Dynamic

  • Scott Guthrie's blog post 关于动态LINQ(第1部分:使用LINQ动态查询库)