2009-10-20 8 views
9

Parece que no puedo encontrar la manera de ordenar mi vista de cuadrícula con los campos personalizados de datos y .Clasificación de Gridview con campos de plantillas personalizadas

El campo personalizado tener este aspecto:

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

Llama a una función que muestra la cantidad de elemento de la categoría dada tiene.

La ordenación de los campos de datos funcionan perfectamente, pero no en los campos personalizados. Im también estoy buscando un método genérico que funcione para todos mis gridviews.

¿Alguien puede ayudarme en la dirección correcta, por favor? Debajo está mi código de grid personalizado completo.

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

¿Puedes mostrar un código aspx de esta vista de grilla? –

Respuesta

4

Asegúrese de que especifica la propiedad SortExpression en el campo de la plantilla

<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

que tenía el mismo problema, el BoundField clasificaba como debe ser, pero no lo hicieron el TemplateField tipo en absoluto.

I cambiado esto:

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

Para esto:

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

Quité el HeaderTemplate y añade el HeaderText en el TemplateField.

Cuestiones relacionadas