【问题标题】:How to sort GridView by a 2-level object property如何按 2 级对象属性对 GridView 进行排序
【发布时间】:2014-05-26 17:48:29
【问题描述】:

我为我的 GridView 使用模型绑定,并使用 SortExpression 自动对其进行排序。但我遇到了这个问题。当我有一个 1 级排序表达式 (Id) 时它工作正常,但是当我想使用 2 级表达式 (Address.City) 时没有任何反应。 示例:

<asp:TemplateField HeaderText="City" SortExpression="Address.City">
    <ItemTemplate>
        <asp:Label ID="lblCity" runat="server"><%# Eval("Address.City")%></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

那么,如何通过 2 级对象属性对 GridView 进行排序?

谢谢!

【问题讨论】:

    标签: c# asp.net sorting gridview model-binding


    【解决方案1】:

    试试这个:

    public Expression<Func<T, object>> GetLambdaExpressionForSortProperty(string propertyname) where T : class
    {
        Expression member = null;
        var propertyParts = propertyname.Split(new[]{'.'}, StringSplitOptions.RemoveEmptyEntries);
        var param = Expression.Parameter(typeof(T), "arg");
        Expression previous = param;
    
        foreach(string s in propertyParts)
        {
            member = Expression.Property(previous, s);
            previous = member;
        }
    
        if(member.Type.IsValueType)
        {
            member = Expression.Convert(member, typeof(object));
        }
    
        return Expression.Lambda<Func<T, object>>(member, param);
    }
    
    protected void gridView_OnSorting(object sender, GridViewSortEventArgs e)
    {
        var orderby = GetLambdaExpressionForSortProperty<DataModel>(e.SortExpression);
        var sortedData = YourDataArray.OrderByAscending(orderby).ToList();
        gridView.DataSource = sortedData;
        gridView.DataBind();
    }
    

    【讨论】:

    • 谢谢,它工作正常.. 但如果我使用 ModelBinding 时,它不可能为 GridView 设置 DataSource。这种情况该怎么办?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-08
    • 1970-01-01
    • 2013-02-12
    • 2023-04-03
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多