这个问题已被提出很多问题(我知道)但是我无法实现对我有用的东西。
我正在使用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
实施BindingSource
,MSDN文章中对此进行了说明这个属性。
我主要想了解的是为什么此属性始终设置为IBindingListView
,尽管我使用的类实现了所需的接口以允许多列排序。我还看到了一些关于如何通过多个属性实现对象列表排序的示例,例如this example,除非我误解了某些内容,否则这仍然依赖于强类型的IList输入。
答案 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
GitHub repository System.Linq.Dynamic
Scott Guthrie's blog post 关于动态LINQ(第1部分:使用LINQ动态查询库)