2009-10-20 9 views
9

Ich kann nicht scheinen, um herauszufinden, wie meine gridview Felder sowohl mit Databound UND Gewohnheit zu sortieren.Gridview mit Feldern Vorlage benutzerdefinierte Sortierung

Das benutzerdefinierte Feld wie folgt aussehen:

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

Er fordert eine Funktion, die die angegebene Kategorie angezeigt, wie viele Artikel zeigt.

Die Sortierung für die databounded Feldern arbeiten perfec aber nicht die Custom. Im suchen auch nach einer generischen Methode, die für alle meine gridviews funktioniert.

Kann mir bitte jemand in die richtige Richtung helfen? Unten ist mein vollständiger customgrid-Code.

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

Können Sie einen aspx-Code dieser Gridview anzeigen? –

Antwort

4

Achten Sie darauf, die SortExpression Eigenschaft auf das Schablonenfeld angeben

<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

Ich hatte das gleiche Problem, das BoundField wurde Sortierung, wie es sollte, aber die TemplateField tat nicht Art überhaupt.

ich änderte sich dies:

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

Um dies:

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

ich die HeaderTemplate entfernt und die HeaderText im TemplateField hinzugefügt.