是否有简单的“.Net”方式进行分层排序
...表
A|B|C
-----
1|2|5
2|8|4
2|4|3
3|7|2
4|4|1
点击A,然后B就能找到你......
A|B|C
-----
1|2|5
2|4|3
2|8|4
3|7|2
4|4|1
变化是我在(A)的背景下排序(B)等等。
显然这可以在数据源中管理,但是想知道某人是否有一个优雅且可扩展的解决方案..谢谢。
答案 0 :(得分:2)
如果您要求与分页一起使用,那么就没有简单且可扩展的解决方案。事实上,这是商业应用程序Web开发的一个圣杯。例如,请参阅StackOverflow问题Dynamic Sorting within SQL Stored Procedures,它涉及同样的事情。毕竟,如果我们在数据库服务器上进行动态排序,我们只需要编写用于管理用户排序选择的机制。
对于多列排序,您实际上只有三个选项:
在客户端中执行此操作,让您的数据容器执行繁重的工作(当您使用内置此功能的数据容器时,例如System.Data.DataView
)。
编写自己的算法并在绑定前自行对数据进行排序。
通过上述链接中讨论的解决方案之一在数据库服务器上执行此操作。
这两种客户端解决方案都不具备可扩展性,因为它们涉及在您可能只需要一个子集时提取和提供所有数据。
答案 1 :(得分:2)
为了让一个ASP.NET GridView在BoundField的Sort规范中列出多列时正确排序,你需要将网格的OnSorting事件绑定到这个函数:
protected void gridViewSorting(object sender, GridViewSortEventArgs e)
{
//
// This odd function permits GridView objects to sort on multiple columns
// Without this function, a GridView object does not sort correctly when multiple
// columns are named in its sort specification.
//
if (!(sender is GridView))
{
return;
}
if (!e.SortExpression.Contains(','))
{
return;
}
GridView gv = sender as GridView;
//
// Find the column that is to become the basis of the sort
//
foreach (DataControlField dc in gv.Columns)
{
String fieldSortExprClean = dc.SortExpression.Replace(" DESC", "");
fieldSortExprClean = fieldSortExprClean.Replace(" ASC", "");
String eventSortExprClean = e.SortExpression.Replace(" DESC", "");
eventSortExprClean = eventSortExprClean.Replace(" ASC", "");
if (fieldSortExprClean == eventSortExprClean)
{
if (e.SortDirection == SortDirection.Ascending)
{
dc.SortExpression = fieldSortExprClean.Replace(",", " ASC,");
e.SortExpression = fieldSortExprClean.Replace(",", " ASC,");
}
else
{
dc.SortExpression = fieldSortExprClean.Replace(",", " DESC,");
e.SortExpression = fieldSortExprClean.Replace(",", " DESC,");
}
}
}
}
答案 2 :(得分:0)
ASPX页面
<asp:GridView id="MyGridView" runat="server" AllowSorting="true" OnSorting="MyGridView_OnSorting">
<asp:BoundField DataField="ColumnA" SortExpression="A" />
<asp:BoundField DataField="ColumnB" SortExpression="B" />
<asp:BoundField DataField="ColumnC" SortExpression="C" />
</asp:GridView>
背后的代码
protected void MyGridView_OnSorting(object sender, GridViewSortEventArgs e)
{
List<MyEntity> data = MyBLL.GetDataSource();
data.Sort(delegate(MyEntity x, MyEntity y) {
switch(e.SortExpression)
{
case "ColumnA":
return String.Compare(x.ColumnA, y.ColumnA);
break;
case "ColumnB":
return String.Compare(x.ColumnB, y.ColumnB);
break;
case "ColumnC":
return String.Compare(x.ColumnC, y.ColumnC);
break;
}
}
);
MyGridView.DataSource = data;
MyGridView.DataBind();
}