2009-10-20 15 views
9

データバインドと カスタムフィールドの両方でグリッドビューを並べ替える方法がわかりません。カスタムテンプレートフィールドでのグリッドビューの並べ替え

カスタムフィールドは、次のようになります。

<asp:Label ID="lblItems" runat="server" Text='<%# GetItems((int)DataBinder.Eval(Container.DataItem, "ObjectCategoryID"))%>' /> 

それは、特定のカテゴリが持つどのように多くの項目を示して機能するために呼び出します。

データバインドされたフィールドの並べ替えはperfecでは機能しますが、カスタムフィールドでは機能しません。 Im また、すべての私のgridviewsのために働く一般的なメソッドを探しています。

誰かが正しい方向に私を助けてくれますか?以下は完全なカスタムグリッドコードです。

using System; 
using System.Data; 
using System.Configuration; 
using System.Linq; 
using System.Web; 
using System.Web.Security; 
using System.Web.UI; 
using System.Web.UI.HtmlControls; 
using System.Web.UI.WebControls; 
using System.Web.UI.WebControls.WebParts; 

using System.Xml.Linq; 
using System.Collections; 

namespace CustomControls 
{ 
    public class CustomGrid : GridView 
    { 
     public CustomGrid() 
     { 
       PageIndexChanging += CustomGrid_PageIndexChanging; 
     }   

    private string ConvertSortDirectionToSql(SortDirection sortDirection) 
    { 
     string newSortDirection = String.Empty; 

     switch (sortDirection) 
     { 
      case SortDirection.Ascending: 
       newSortDirection = "ASC"; 
       break; 

      case SortDirection.Descending: 
       newSortDirection = "DESC"; 
       break; 
     } 

     return newSortDirection; 
    } 

    protected void CustomGrid_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     this.PageIndex = e.NewPageIndex; 
     this.DataBind(); 
    } 

    protected override void OnSorting(GridViewSortEventArgs e) 
    { 
     DataSet ds = (DataSet)System.Web.HttpContext.Current.Session["Source"]; 
     DataTable dataTable = ds.Tables[0]; 

     if (dataTable != null) 
     { 
      DataView dataView = new DataView(dataTable); 


      if ((string)System.Web.HttpContext.Current.Session["Direction"] == "Asc") 
      { 
       dataView.Sort = e.SortExpression + " " + "ASC"; 
       System.Web.HttpContext.Current.Session["Direction"] = "Desc"; 
      } 

      else if ((string)System.Web.HttpContext.Current.Session["Direction"] == "Desc") 
      { 
       dataView.Sort = e.SortExpression + " " + "DESC"; 
       System.Web.HttpContext.Current.Session["Direction"] = "Asc"; 
      } 

      else 
      { 
       dataView.Sort = e.SortExpression + " " + "ASC"; 
       System.Web.HttpContext.Current.Session["Direction"] = "Desc"; 
      } 

      this.DataSource = dataView; 
      this.DataBind(); 
     } 
    } 

    protected override void OnInit(System.EventArgs e) 
    { 
     this.AllowSorting = true; 
     this.AllowPaging = true; 
     this.PagerSettings.Mode = PagerButtons.NumericFirstLast; 
     this.AutoGenerateColumns = false; 
     this.CssClass = "gv"; 
     this.RowStyle.CssClass = "gvRow"; 
     this.AlternatingRowStyle.CssClass = "gvAlternateRow"; 
     this.HeaderStyle.CssClass = "gvHeader"; 
     this.GridLines = GridLines.None; 
     this.PagerStyle.CssClass = "gvPager"; 
     this.EmptyDataText = "<div style=\"width:100%;text-align:left;\">No data found</div>"; 
    } 
} 
+0

このグリッドビューのaspxコードを表示できますか? –

答えて

4

あなたは、私は同じ問題が持っていたテンプレートフィールド

<asp:TemplateField HeaderText="Object Category ID" SortExpression="ObjectCategoryID"> 
<ItemTemplate> 
    <asp:Label ID="lblItems" runat="server" Text='<%# GetItems((int)DataBinder.Eval(Container.DataItem, "ObjectCategoryID"))%>' /> 
</ItemTemplate> 
</asp:TemplateField> 
14

にSortExpressionプロパティを指定していることを確認し、BoundFieldはそれが必要として、ソートされたが、TemplateFieldは、ソート全くありませんでした。

私はこの変更された:これに

<asp:TemplateField SortExpression="Category"> 
    <HeaderTemplate>Category</HeaderTemplate> 
    <ItemTemplate>A value</ItemTemplate> 
</asp:TemplateField> 

<asp:TemplateField HeaderText="Category" SortExpression="Category"> 
    <ItemTemplate>A value</ItemTemplate> 
</asp:TemplateField> 

を私はHeaderTemplateを除去しTemplateFieldHeaderTextを添加しました。

関連する問題