当与列表绑定时,如何排序网格视图数据
本文关键字:排序 网格 数据 视图 何排序 列表 绑定 定时 | 更新日期: 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层排序。假设您希望对引用单个字段的数据进行排序。您需要执行以下操作:
- 在ViewState 中跟踪排序方向
- 处理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});
请注意,这只是一个示例,可能需要根据您的具体情况进行调整。
感谢大家为我提供的解决问题的提示。在这里,我发现了堆栈溢出的帖子,这在我的情况下是完美的。
基于子实体属性