[英]Sorting grid view column using linq
我將數據綁定到模板字段中的gridview,如:
<asp:TemplateField HeaderText="Business Objective" SortExpression="BusinessObjective.BusinessObjectiveText">
<ItemTemplate>
<asp:Label ID="lblBusinessObjectiveText" runat="server" Text='<%#DataBinder.Eval(Container.DataItem, "BusinessObjective.BusinessObjectiveText") %>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
在后面的代碼中,我只是將列表綁定到網格視圖:
gvBussinessRisks.DataSource = this.BusinessRiskList;
gvBussinessRisks.DataBind();
列表的類型為“ BusinessRisk”。 實體結構就像
public class BusinessRisk
{
public BusinessRisk()
{
BusinessObjective BusinessObjective = new BusinessObjective();
}
public int? BusinessRiskId { get; set; }
public int ObjectiveId { get; set; }
public string BusinessRiskText { get; set; }
public string Description { get; set; }
public bool IsActive { get; set; }
public long ActionedBy { get; set; }
public long? DelegatedTo { get; set; }
public int? LastLogId { get; set; }
public int AppOwnerId { get; set; }
public BusinessObjective BusinessObjective { get; set; }
}
我的BusinessObjective類具有名為“ BusinessObjectiveText”的屬性,該屬性將綁定到網格視圖中的某一列。
但是,當我嘗試對此列進行排序時,我得到了錯誤。
我的排序事件類似於:
List<BusinessRisk> sortedList = this.BusinessRiskList;
sortedList.Sort(new GenericComparer<BusinessRisk>(e.SortExpression, (SortDirection)Enum.Parse(typeof(SortDirection), GetSortDirection(e.SortExpression))));
gvBussinessRisks.DataSource = sortedList;
gvBussinessRisks.DataBind();
而“ GenericComparer”類是:
public class GenericComparer<T> : IComparer<T>
{
private string sortExpression;
private SortDirection sortDirection;
public GenericComparer(string sortExpression, SortDirection sortDirection)
{
this.sortExpression = sortExpression;
this.sortDirection = sortDirection;
}
public int Compare(T x, T y)
{
PropertyInfo propertyInfo = typeof(T).GetProperty(sortExpression);
IComparable obj1 = (IComparable)propertyInfo.GetValue(x, null);
IComparable obj2 = (IComparable)propertyInfo.GetValue(y, null);
if (SortDirection == SortDirection.Ascending)
{
if (obj1 != null)
return obj1.CompareTo(obj2);
return 0;
}
else
{
if (obj1 != null)
return obj2.CompareTo(obj1);
return 0;
}
}
public SortDirection SortDirection
{
get { return this.sortDirection; }
set { this.sortDirection = value; }
}
}
當我嘗試按GenericComparer
類中的方法對此列進行排序時出現錯誤(方法:比較),我將propertyInfo
獲取為null
。 如果我使用BusinessRisk
屬性進行排序,則排序會正確進行,但是在這里,我嘗試使用BussinessObjective類的屬性之一進行排序。
我嘗試了Google,但沒有得到任何解決方案。
終於,經過Google的大量努力和小小的頭腦風暴,我得到了使用Dynamic Linq解決方案。
我放棄了GenericComparer類,只是在Sorting事件中編寫了以下代碼
string sortColumn = e.SortExpression;
IQueryable<BusinessRisk> sortedList = (from p in this.BusinessRiskList
select new BusinessRisk
{
BusinessRiskText = p.BusinessRiskText,
IsActive = p.IsActive,
Description = p.Description,
BusinessObjective = new BusinessObjective { BusinessObjectiveText = p.BusinessObjective.BusinessObjectiveText }
}).AsQueryable().OrderBy(e.SortExpression);
this.BusinessRiskList = sortedList.ToList<BusinessRisk>();
gvBussinessRisks.DataSource = sortedList;
gvBussinessRisks.DataBind();
它對我來說非常完美。
謝謝所有嘗試幫助我的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.