Desenvolvimento - ASP. NET
Sorting no ASP.NET: Organizando as idéias - Parte I
Neste artigo mostrarei como utilizar os recursos de Sorting dentro do ASP.NET. Do mais simples ao mais complexo.
por Cristian Arrano TownsendVale lembrar que os recursos de Sorting que vem com o ASP.NET sao validos somente para o controle Datagrid. Como os controles DataList e Repeater trabalham com Templates, a maneira de fazer o sorting é na base da customizaçao, ou no portugues, "descendo a lenha no teclado".
Todos os exemplos utilizarão o banco de dados Northwind do MS SQL 2000.
Simple Sorting
Para este nosso exemplo utilizarei um Web Form que conecta e mostra os dados de uma tabela. A figura abaixo mostra como é o nosso DataGrid (id=dGrid).
O código HTML é mostrado abaixo.
<form id="Form1" method="post" runat="server"> <asp:DataGrid id="dGrid" runat="server"></asp:DataGrid> <P> <asp:Label id="lblMsg" runat="server">Label</asp:Label></P> <P></P> </form>
Código da Classe
Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _ Handles MyBase.Load If Not Page.IsPostBack Then BindData() End If End Sub Sub BindData() Dim cnn As New SqlConnection("server=localhost;database=northwind;trusted_connection=true") Dim cmm As New SqlCommand("select * from customers", cnn) Try cnn.Open() Dim dr As SqlDataReader = cmm.ExecuteReader Me.dGrid.DataSource = dr Me.dGrid.DataBind() Catch ex As Exception Me.lblMsg.Text = ex.Message.ToString Finally If cnn.State = ConnectionState.Open Then cnn.Close() End If End Try End Sub
Simples. O código acima vai gerar uma página como a figura abaixo:
Utilizando a propriedade Allowsorting
O DataGrid contém uma propriedade chamada AllowSorting. A maneira mais fácil de permitir Sorting em um DataGrid é configurando a propriedade AllowSorting para True e criar um evento SortCommand para o DataGrid. Tudo isso com a propriedade do DataGrid AutoGenerateColumns=False.
Somente o fato de configurar a propriedade AllowSorting para True provoca a seguinte mudança, como é mostrado na figura abaixo:
O nome de cada coluna se transforma em um HyperLink, mas ainda falta um pouco. Ou melhor, falta o escencial: o código.
O código do evento SortCommand é mostrado abaixo:
Sub SortDataGrid(ByVal sender As Object, ByVal e As DataGridSortCommandEventArgs) BindData(e.SortExpression) End Sub
O código do DataGrid também sofreu algumas mudanças, como mostra o código abaixo:
<asp:DataGrid OnSortCommand="SortDataGrid" AllowSorting="True" id="dGrid" runat="server"> </asp:DataGrid>
O sub BindData foi modificado para que aceitasse o parâmetro de sorting, como mostra o código a continuação:
Sub BindData(Optional ByVal strOrder As String = "") Dim cnn As New SqlConnection("server=localhost;database=northwind;trusted_connection=true") Dim strSql As String = "select * from customers" If strOrder <> "" Then strSql += " order by " & strOrder End If Dim cmm As New SqlCommand(strSql, cnn) Try cnn.Open() Dim dr As SqlDataReader = cmm.ExecuteReader Me.dGrid.DataSource = dr Me.dGrid.DataBind() Catch ex As Exception Me.lblMsg.Text = ex.Message.ToString Finally If cnn.State = ConnectionState.Open Then cnn.Close() End If End Try End Sub
Dificultando um pouco
No exemplo anterior, nós utilizamos um DataGrid com a propriedade AutoGenerateColumns como True. Isso quer dizer que o nome de cada coluna foi gerado automaticamente pelo controle. É um fantástico recurso, porém a probabilidade de uso é bem baixa, pra não dizer que é quase zero. Sempre vamos querer algo personalizado. Para isso, temos que configurar tal propriedade para False.
No nosso exemplo utilizando a propriedade AtuoGenerateColumns para False, vamos utilizar BoundColumns para customizar as nossas colunas.
Quando ambas propriedades (AutoGenerateColumns e AllowSorting) estão como True, a propriedade SortExpression de cada coluna do DataGrid e automaticamente "configurada" para o nome do campo que a coluna representa.
O código abaixo mostra como criar um Web Form utilizando os recursos de Sorting com a propriedade AutoGenerateColumns como False
<asp:DataGrid AllowSorting=True OnSortCommand="SortDataGrid" id="dGrid" runat="server" AutoGenerateColumns="False"> <Columns> <asp:BoundColumn DataField="ContactName" SortExpression="ContactName" HeaderText="Nome"></asp:BoundColumn> <asp:BoundColumn DataField="City" HeaderText="City" SortExpression="City"></asp:BoundColumn> <asp:BoundColumn DataField="country" SortExpression="Country" HeaderText="Country" DataFormatString="{0:c}"></asp:BoundColumn> </Columns> </asp:DataGrid>
O primeiro que podemos perceber é que a propriedade AutoGenerateColumns está como False. O que tambem podemos perceber é que cada BoundColumn tem uma propriedade chamada SortExpression, que define o campo pelo qual os registros serão filtrados.
Na segunda parte veremos como fazer o sort de maneira ascendente e descendente.