当与列表绑定时,如何排序网格视图数据

本文关键字:排序 网格 数据 视图 何排序 列表 绑定 定时 | 更新日期: 2023-09-27 18:13:30

我正在绑定ASP。带有列表对象的网格视图。我已经创建了从各自接口继承的Country和City类。

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排序,但失败了。我如何使用列表在网格视图中排序数据?

我已经尝试使用下列方法,但没有工作

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

当与列表绑定时,如何排序网格视图数据

除了@Ganesh_Devlekar所说的,你也可以通过使用降序来订购:

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

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

希望对大家有所帮助

尝试在方法GetAllCity()

这个将按CityName排序

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

排序必须手动处理。根据你的需求,它可能会很复杂——比如说,如果你想要一个3层排序。假设您希望对引用单个字段的数据进行排序。您需要执行以下操作:

  1. 在ViewState
  2. 中跟踪排序方向
  3. 处理GridView的排序事件,并从后端适当地查询数据

下面是改编自这里的示例代码片段:

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

如果您希望对两个不同的字段进行排序,则需要稍微复杂一点的东西。具体来说,您需要向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});

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

感谢大家为我提供的解决问题的提示。在这里,我发现了堆栈溢出的帖子,这在我的情况下是完美的。

基于子实体属性

构建OrderBy Lambda表达式