如何在与List绑定时对网格视图数据进行排序

时间:2014-07-19 06:30:55

标签: c# asp.net

我将ASP.Net网格视图与列表对象绑定。我创建了从各自界面继承的Country和City Class。

public interface ICountry
{
    int cmID { get; set; }
    string cmName { get; set; }        
}

public interface ICity 
{
    int ctyId { get; set; }
    string ctyName { get; set; }    
}

public class Country : ICountry
{
    public int cmID { get; set; }
    public string cmName { get; set; }     
}

 public class City : ICity
{
    public int ctyId { get; set; }
    public string ctyName { get; set; }
    public ICountry Country { get; set; }   


public List<City> GetAllCity(string SortDirection, string SortExpression)
{
   DataTable dt = FillCity()            //returns city,country in a table
   List<City> obj = new List<City>();          
   foreach(DataRow dr in dt.Rows)
   {
       City o = new City();
       o.ctyName = dr["ctyName"].ToString();
       o.Country.cmName = dr["cmName"].ToString();
       obj.Add(o);
   }

       dt.Dispose();
       return obj;          
}


    <asp:GridView ID="GridView1" runat="server" Width="100%" AutoGenerateColumns="false" PageSize="15"
AllowPaging="true" OnPageIndexChanging="GRV1_PageIndexChanging"
AllowSorting="true" onsorting="GRV1_Sorting">                                    
<Columns>
    <asp:TemplateField ItemStyle-Width="10%" ItemStyle-HorizontalAlign="Left" HeaderText="City" SortExpression="ctyName ">
        <ItemTemplate>
            <%# Eval("ctyName")%>
        </ItemTemplate>
    </asp:TemplateField>
    <asp:TemplateField ItemStyle-Width="15%" ItemStyle-HorizontalAlign="Left" HeaderText="Country" SortExpression="Country.cmName">
        <ItemTemplate>
            <%# Eval("Country.cmName")%>
        </ItemTemplate>
    </asp:TemplateField>
</Columns></asp:GridView>

我尝试使用Linq进行排序,但未能这样做。如何使用List对网格视图中的数据进行排序?

我尝试使用以下但没有工作

            if (obj != null)
        {

            var param = Expression.Parameter(typeof(MemorandaClosing), SortExpression);
            var sortExpression = Expression.Lambda<Func<MemorandaClosing, object>>(Expression.Convert(Expression.Property(param, SortExpression), typeof(object)), param);

            if (SortDirection == "ASC")
            {
                obj.AsQueryable<MemorandaClosing>().OrderBy(sortExpression);
            }
            else
            {
                obj.AsQueryable<MemorandaClosing>().OrderByDescending(sortExpression);
            };
        }

5 个答案:

答案 0 :(得分:0)

在方法GetAllCity()

中尝试这样做

这将按CityName命令

return obj.OrderBy(x => x.ctyName).ToList();  

答案 1 :(得分:0)

在了解@Ganesh_Devlekar所说的内容时,您也可以通过使用下划线来订购:

return obj.OrderByDescending(x => x.ctyName).ToList()

甚至使用Where或其他东西进行某种过滤;)

我希望这会有所帮助

答案 2 :(得分:0)

如果您想要对可能的两个不同字段进行排序,则需要更复杂的东西。具体来说,您需要指定要排序的GetAllCity()方法哪个字段。这是一种可能的方法(诚然不是最优雅的):

public List<City> GetAllCity(bool SortOnCity, bool SortOnCountry)
{
    //main code omitted for brevity

    if (SortOnCity && !SortOnCountry)
        return obj.OrderBy(x => x.ctyName).ToList();
    else if (SortOnCountry && !SortOnCity)
        return obj.OrderBy(x => x.Country.cmName).ToList();
    else if (SortOnCity && SortOnCountry)
        return obj.OrderBy(x => new {x.ctyName, x.Country.cmName}).ToList();
}

对于我的钱,我会传入一个lambda表达式参数,该参数将传递给OrderBy方法,而不是有这么脏if...else...else,但我认为上面的代码演示了概念更好。

要重写上面的代码,将SortOrder和SortExpression作为变量传递,您可以执行以下操作:

public List<City> GetAllCity<TKey>(SortDirection order, Expression<Func<City, TKey>> SortExpression)
{
    //main code omitted for brevity

    if (order == SortDirection.Ascending)
        return obj.OrderBy(SortExpression);
    else
        return obj.OrderByDescending(SortExpression);

}

然后,您将传入一个表示要排序的属性的lambda表达式,类似于:

GetAllCity(SortDirection.Ascending, c => new {c.ctyName, c.Country.cmName});

请注意,这只是一个示例,可能需要根据您的具体情况进行调整。

答案 3 :(得分:0)

必须手动处理排序。根据您的要求,它可能很复杂 - 例如,如果您想要3级排序。假设您想要参考单个字段对数据进行排序。您需要执行以下操作:

  1. 跟踪ViewState中的排序方向
  2. 处理GridView的排序事件,并从后端适当地查询数据。
  3. 以下是从here改编的示例摘要:

    public SortDirection GridViewSortDirection
    {
        get
        {
            if (ViewState["sortDirection"] == null)
                ViewState["sortDirection"] = SortDirection.Ascending;
    
            return (SortDirection)ViewState["sortDirection"];
        }
        set { ViewState["sortDirection"] = value; }
    }
    
    protected void gridView_Sorting(object sender, GridViewSortEventArgs e)
    {           
        if (GridViewSortDirection == SortDirection.Ascending)
        {
            myGridView.DataSource = GetData(e.SortExpression, SortDirection.Ascending);
            GridViewSortDirection = SortDirection.Descending;
        }
        else
        {
            myGridView.DataSource = GetData(e.SortExpression, SortDirection.Descending);
            GridViewSortDirection = SortDirection.Ascending;
        };
        myGridView.DataBind();        
    }
    

答案 4 :(得分:0)

感谢各位为我提供解决问题的提示。在这里,我发现堆栈溢出的帖子在我的情况下非常完美。

Building an OrderBy Lambda expression based on child entity's property