Para além de visualizarmos os dados, muitas vezes é necessário procedermos à ordenação dos mesmos. Por exemplo, o novo controlo GridView permite a realização de uma operação deste tipo por parte de um utilizador final.O controlo ObjectDataSource permite-nos definir um método que recebe um parâmetro que é utilizado para indicar a ordenação e respectivo sentido (ascendente e descente). A ordenação dos dados implica a adição de um novo método à classe FuncionariosRepository de forma a que o controlo consiga executar este tipo de operações.
using System;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Web.Configuration;
namespace ObjectDemo
{
public class FuncionarioRepository
{
public FuncionarioCollection LoadFuncionarios( )
{
FuncionarioCollection funcionarios = new FuncionarioCollection();
using ( SqlConnection cnn = new SqlConnection( WebConfigurationManager.ConnectionStrings ["funcDB"].ConnectionString ) )
{
SqlCommand cmd = new SqlCommand( "select IdFuncionarios, Nome, Morada, Telefone from funcionarios", cnn );
cnn.Open( );
SqlDataReader reader = cmd.ExecuteReader( CommandBehavior.CloseConnection );
while ( reader.Read( ) )
{
funcionarios.Add( new Funcionario( reader.GetInt32( 0 ), reader.GetString( 1 ), reader.GetString( 2 ), reader.GetString( 3 ) ) );
}
reader.Close( );
}
return funcionarios;
}
public FuncionarioCollection LoadFuncionarios( string sortColumn)
{
if ( string.IsNullOrEmpty( sortColumn ) ) return LoadFuncionarios( );
FuncionarioCollection funcionarios = new FuncionarioCollection( );
using ( SqlConnection cnn = new SqlConnection( WebConfigurationManager.ConnectionStrings ["funcDB"].ConnectionString ) )
{
SqlCommand cmd = new SqlCommand( "select IdFuncionarios, Nome, Morada, Telefone from funcionarios order by " + sortColumn, cnn );
cnn.Open( );
SqlDataReader reader = cmd.ExecuteReader( CommandBehavior.CloseConnection );
while ( reader.Read( ) )
{
funcionarios.Add( new Funcionario( reader.GetInt32( 0 ), reader.GetString( 1 ), reader.GetString( 2 ), reader.GetString( 3 ) ) );
}
reader.Close( );
}
return funcionarios;
}
}
}
A implementação do método começa por verificar se o parâmetro sortColumn possui um valor válido. Se tal não acontecer, invocamos o método LoadFuncionarios definido inicialmente. Por outro lado, um valor válido no parâmetro é sinónimo de uma expressão que permite ordenar os dados. No nosso exemplo, os nomes dos campos da tabela Funcionarios são os mesmos das propriedades expostas pela classe Funcionario. Esta situação é ideal uma vez que o controlo GridView utilizado nas nossas experiências está preparado para reagir a um click sobre o cabeçalho de uma coluna através da invocação do método correspondente no controlo data source associado. Ao executar esse método, o controlo GridView passa uma expressão de ordenação construída a partir do nome do campo e do tipo de ordenação pretendida (se as propriedades possuissem nomes diferentes dos campos da tabela teríamos de adaptar o código do método LoadFuncionarios de forma a que este construisse uma instrução de SQL válida para o nosso problema).
A página seguinte utiliza o controlo GridView para executar a ordenação dos dados provenientes do controlo ObjectDataSource:
<%@ Page Language="C#" %>
<html>
<head runat="server">
<title>Untitled Page</title>
</head>
<body>
<form id="form1" runat="server">
<h3>Apresenta uma lista de alunos</h3>
<asp:GridView ID="grid" runat="server" DataSourceID="source"
AllowSorting="true">
</asp:GridView>
<asp:ObjectDataSource ID="source" runat="server"
TypeName="ObjectDemo.FuncionarioRepository"
SelectMethod="LoadFuncionarios"
SortParameterName="sortColumn" >
</asp:ObjectDataSource>
</form>
</body>
</html>
Como é possível verificar, recorremos à propriedade SortParameterName para definir o nome do parâmetro esperado pelo método de select que é utilizado por efectuar a ordenação.Um click sobre o cabeçalho da grid faz com que o nosso método adicionado à classe FuncionariosRepository seja executado. Na próxima entrada vamos adaptar a nossa classe de forma a possibilitar a paginação dos dados provenientes do controlo ObjectDataSource.
posted on Wednesday, June 29, 2005 11:11 PM