次のようなテンプレート フィールドでデータを 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クラスには、グリッドビューの列の1つにバインドしている「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 クラスのプロパティの 1 つを使用して並べ替えようとしています。
Google を試しましたが、解決策が得られませんでした。