我将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);
};
}
答案 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级排序。假设您想要参考单个字段对数据进行排序。您需要执行以下操作:
以下是从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