1

次のようなテンプレート フィールドでデータを 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 を試しましたが、解決策が得られませんでした。

4

1 に答える 1

1

最後に、多くの 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();

そして、それは私にとって完璧に機能します。

私を助けてくれた皆さん、ありがとう。

于 2013-04-29T09:11:25.970 に答える