2012-10-03 33 views
5

Actualmente estoy trabajando en algún código que se ocupa de ordenar y paginar datos en una vista de cuadrícula. Ahora estoy tratando de implementar la flecha de ordenación (flechas arriba/abajo al lado de los encabezados de columna) pero no tengo éxito. El código para implementar las flechas de clasificación se encuentra en la rutina secundaria * GridView1_RowCreated *. En este momento, cuando ejecuto el código, no veo las flechas de clasificación en absoluto. La línea problemática es la siguiente: "If tblAdministrators.SortExpression = lnk.CommandArgument Then" No puedo entender qué pasa con esa línea. Siempre es False por lo tanto, las flechas no aparecen.Gridview ordenando flecha arriba/abajo en los encabezados de las columnas

Private Function GetData(sort As SortDirection) As Data.DataView 

    Dim connection As OracleDBConnect = DAL.GetOracleDBConnection() 
    Dim request As OracleDBRequest = Nothing 
    Dim result As OracleDBResult = Nothing 
    Dim trace As OracleDBChronoTrace = Nothing 
    Dim status As DBStatus 
    Dim sb As New StringBuilder 
    Dim dv As DataView 

    With sb 
     .Append("SELECT * FROM USERS") 
    End With 

    request = New OracleDBRequest(sb.ToString, CommandType.Text) 

    status = connection.Execute(request, result, trace) 

    dv = New DataView(result.DataSet.Tables(0)) 

    If (ViewState("sortExp") IsNot Nothing) Then 
     dv = New Data.DataView(result.DataSet.Tables(0)) 

     If (GridViewSortDirection = SortDirection.Ascending) Then 
      GridViewSortDirection = SortDirection.Descending 
      dv.Sort = CType(ViewState("sortExp").ToString() & DESCENDING, String) 
     Else 
      GridViewSortDirection = SortDirection.Ascending 
      dv.Sort = CType(ViewState("sortExp").ToString() & ASCENDING, String) 
     End If 
    Else 
     dv = result.DataSet.Tables(0).DefaultView 
    End If 

    Return dv 

End Function 


Public Property GridViewSortDirection() As SortDirection 
    Get 
     If ViewState("sortDir") Is Nothing Then 
      ViewState("sortDir") = SortDirection.Ascending 
     End If 

     Return CType(ViewState("sortDir"), SortDirection) 
    End Get 

    Set(ByVal value As SortDirection) 
     ViewState("sortDir") = value 
    End Set 

End Property 


Protected Sub GridView1_PageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs) Handles tblAdministrators.PageIndexChanging 

    tblAdministrators.PageIndex = e.NewPageIndex 
    GridViewSortDirection = If(GridViewSortDirection = SortDirection.Descending, SortDirection.Ascending, SortDirection.Descending) 
    tblAdministrators.DataSource = GetData(GridViewSortDirection) 
    tblAdministrators.DataBind() 

End Sub 


Protected Sub GridView1_Sorting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewSortEventArgs) Handles tblAdministrators.Sorting 

    ViewState("sortExp") = e.SortExpression 
    tblAdministrators.DataSource = GetData(GridViewSortDirection) 
    tblAdministrators.DataBind() 

End Sub 

Protected Sub GridView1_RowCreated(sender As Object, e As GridViewRowEventArgs) Handles tblAdministrators.RowCreated 
    If e.Row.RowType = DataControlRowType.Header Then 
     For Each tc As TableCell In e.Row.Cells 
      If tc.HasControls() Then 

       Dim lnk As LinkButton = DirectCast(tc.Controls(0), LinkButton) 
       If lnk IsNot Nothing Then 

        Dim img As New System.Web.UI.WebControls.Image() 

        img.ImageUrl = "/images/" & (If(GridViewSortDirection = SortDirection.Ascending, "asc", "desc")) & ".gif" 

        If tblAdministrators.SortExpression = lnk.CommandArgument Then 

         tc.Controls.Add(New LiteralControl(" ")) 
         tc.Controls.Add(img) 

        End If 
       End If 
      End If 
     Next 
    End If 
End Sub 

código ASPX:

<asp:GridView ID="tblAdministrators" runat="server" AutoGenerateColumns="false" EmptyDataText="No records found" PageSize="25" AllowPaging="True" AllowSorting="True" OnRowCreated="GridView1_RowCreated"> 
     <Columns> 
      <asp:BoundField HeaderText="Name" DataField="Name" SortExpression="NAME"></asp:BoundField> 
     </Columns> 
     <Columns> 
      <asp:BoundField HeaderText="City" DataField="City" SortExpression="CITY"></asp:BoundField> 
     </Columns> 
    </asp:GridView> 

Respuesta

4

Tome un vistazo a mi muestra:

<asp:GridView ID="GridView1" runat="server" AllowPaging="True" 
    AllowSorting="True" AutoGenerateColumns="False" DataKeyNames="CustomerId" 
    DataSourceID="SqlDataSource1"> 
    <SortedAscendingHeaderStyle CssClass="sortasc" /> 
    <SortedDescendingHeaderStyle CssClass="sortdesc" /> 
    <Columns> 
     <asp:CommandField ShowSelectButton="True" /> 
     <asp:BoundField DataField="CustomerId" HeaderText="CustomerId" 
      InsertVisible="False" ReadOnly="True" SortExpression="CustomerId" /> 
     <asp:BoundField DataField="Name" HeaderText="Name" SortExpression="Name" /> 
     <asp:BoundField DataField="IdNumber" HeaderText="IdNumber" 
      SortExpression="IdNumber" /> 
    </Columns> 
</asp:GridView> 

Ponga atención en SortedAscendingHeaderStyle y SortedDescendingHeaderStyle. Solo crea clases de CSS apropiadas con la imagen de fondo (flecha arriba y flecha abajo) y listo.

+0

Gregor. Eso solo funcionará cuando use un SQLDataSource que no es mi caso. Sería genial si funcionara, ya que es muy fácil de implementar. –

+0

Esto es solo un DataSource de muestra. Debería funcionar en cualquier otro tipo de fuente de datos también. –

+0

El "DataSourceID" es obligatorio para usar esas funciones (SortedAscendingHeaderStyle etc ...) En mi código, no estoy usando un control de fuente de datos pero prefiero hacer un enlace de datos manual. –

0

el fin de añadir una flecha de clasificación en una cuadrícula de datos en un formulario Windows VB.net, que ni siquiera tiene que escribir ningún código

  1. El formulario en modo de diseño - seleccione la red está trabajando con, haga clic derecho en propiedades, establezca Modo de selección = Selección de celda
  2. En forma en modo de diseño: haga clic en la flecha de la cuadrícula de la derecha, edite las propiedades de columna, seleccione editar o agregue columnas, configure SortMode = Automático
  3. Si tiene código para el contenido de su celda (supongamos que desea que el usuario abra otro formulario mientras hace clic en cualquier fila de la cuadrícula de datos), utilice CellDouble Haga clic en propiedad para manejar el evento. Si el que ha usado solo clic a continuación, se clasificará la cabecera y también abrir la forma de la célula dada

Private Sub _CellDoubleClick (remitente como objeto, e como DataGridViewCellEventArgs) dirige DGAcctGrpList.CellDoubleClick

Cuestiones relacionadas