在ASP.NET C#中对GridView的列进行排序

7

有人能告诉我如何在c# asp.net中对gridview的列进行排序吗?

gridview绑定的数据来自使用linq创建的datacontext。我希望能够点击列标题来对数据进行排序。

谢谢!

7个回答

9

要正确完成此操作,您需要执行以下两个步骤:

  1. 保留排序状态的视图状态(SortDirection 和 SortExpression)
  2. 根据当前排序状态生成正确的LINQ表达式。

在网格中手动处理 Sorting 事件,并使用我编写的帮助程序按 SortExpression 和 SortDirection 进行排序:

public static IQueryable<T> SortBy<T>(IQueryable<T> source, string sortExpression, SortDirection direction) {
    if (source == null) {
        throw new ArgumentNullException("source");
    }

    string methodName = "OrderBy";
    if (direction == SortDirection.Descending) {
        methodName += "Descending";
    }

    var paramExp = Expression.Parameter(typeof(T), String.Empty);
    var propExp = Expression.PropertyOrField(paramExp, sortExpression);

    // p => p.sortExpression
    var sortLambda = Expression.Lambda(propExp, paramExp);

    var methodCallExp = Expression.Call(
                                typeof(Queryable),
                                methodName,
                                new[] { typeof(T), propExp.Type },
                                source.Expression,
                                Expression.Quote(sortLambda)
                            );

    return (IQueryable<T>)source.Provider.CreateQuery(methodCallExp);
}

db.Products.SortBy(e.SortExpression, e.SortDirection)

请按照我的博客文章中的说明进行操作。


你的排序方法如何处理子对象?例如,你有一个包含order.comment.rating的Order对象,并且你想按照rating进行排序? - Dofs
你需要手动遍历传入的sortExpression中的点。修改代码以处理这个问题非常简单。 - davidfowl

2

MSDN的文章很好,只是需要在.cs文件中更改一行代码:string header = ((Binding)headerClicked.Column.DisplayMemberBinding).Path.Path; MSDN上的代码只有在标题和列名完全相同时才能正常排序。 - Jared Harley

0

更多有关在 GridView 中进行排序的信息可以在此处找到: MSDN GridView 排序 获取数据所使用的方法不应影响排序功能,您可以使用相同的排序方式。


0
在属性面板中双击排序条目。 将创建一个新的函数。 在此函数中编写代码以填充Gridview。 唯一的区别是根据GridViewSortEventArgs e更改查询。
e.SortExpression和e.SortDirection始终为升序:-(
我希望这个非常简短的答案能够帮助到您。

0

添加:

  AllowSorting="true"

加入 <asp:GridView /> 标签,就可以了


如果你只是这样做,它会出现错误:“GridView 'GridView1' 触发了未处理的排序事件。” - Mark Byers

0
当我独自做那件事时,会出现错误“GridView 'GridView1' 触发了未处理的排序事件。”
我以前也遇到过这种情况... 我只是创建了一个临时的处理程序,然后一切似乎就开始工作了。虽然不太美观,但对我有用。
话虽如此,在你的 GridView 代码中,我没有看到任何数据源的参考。你需要像这样的东西:
<asp:LinqDataSource ID="dsMyDataSource" runat="server"
DataContextTypeName="MyDataContext"
TableName="MyTable"
AllowSort="true" />

然后在你的GridView中:

<asp:GridView ID="gvMyGridView" runat="server" DataSourceID="dsMyDataSource" ... />

0

在半伪代码中的SQL查询

string Query= string.Empty;
string SortExpression = string.Empty;

// HDFSort is an HiddenField !!!

protected void SortCommand_OnClick(object sender, GridViewSortEventArgs e)
{
   SortExpression = e.SortExpression; 
   Query = YourQuery + " ORDER BY "+SortExpression +" "+ HDFSort.Value ;
   HDFSort.Value = HDFSort.Value== "ASC" ? "DESC" : "ASC";
   RefreshGridView();
}

protected void RefreshGridView()
{
   GridView1.DataSource = DBObject.GetData(Query);
   GridView1.DataBind();
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接