Reputation: 127
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
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