AsTi
AsTi

Reputation: 127

How to sort GridView by a 2-level object property

I use model binding for my GridView and I sort it automatically using SortExpression. But I faced with the problem. When I have a 1-level Sort Expression (Id) it works fine, but when I want to use 2-level expression(Address.City) nothing happens. Example:

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

So, How to sort GridView by a 2 level object property?

Thanks!

Upvotes: 2

Views: 422

Answers (1)

Schadensbegrenzer
Schadensbegrenzer

Reputation: 950

Try this:

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();
}

Upvotes: 1

Related Questions