O suporte da paginação dos dados obriga à adição de um novo método à nossa classe FuncionariosRepository. Tal como acontecia com a ordenação dos dados, a paginação baseia-se na existência de um método que recebe dois parâmetros: um permite definir a página actual; o outro é usado para especificar o número de elementos por página. O código seguinte apresenta o método adicionado à classe:
public FuncionarioCollection LoadFuncionarios( int startIndex, int maxFuncionariosPerPage )
{
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( );
int i = 0;
int count = 0;
SqlDataReader reader = cmd.ExecuteReader( CommandBehavior.CloseConnection );
while ( reader.Read( ) && count < maxFuncionariosPerPage)
{
if ( i < startIndex )
{
i++;
continue;
}
funcionarios.Add( new Funcionario( reader.GetInt32( 0 ), reader.GetString( 1 ), reader.GetString( 2 ), reader.GetString( 3 ) ) );
count++;
}
reader.Close( );
}
return funcionarios;
}
O controlo ObjectDataSource permite-nos definir o nome dos parâmetros utilizados em operações de paginação através das propriedades StartRowIndexParameterName e MaximumRowsParameterName. O primeiro é utilizado para definir o nome do parâmetro do método de selecção que indica a posição a partir da qual devem ser retornados os elementos. Por sua vez, a segunda propriedade é usada para indicar o nome do parâmetro que permite definir o número de elementos que o método de selecção deve retornar. A página seguinte ilustra a utilização desta funcionalidade:
<%@ 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"
AllowPaging="true" PageSize="3">
</asp:GridView>
<asp:ObjectDataSource ID="source" runat="server"
TypeName="ObjectDemo.FuncionarioRepository"
SelectMethod="LoadFuncionarios"
StartRowIndexParameterName="startIndex"
MaximumRowsParameterName="maxFuncionariosPerPage"
EnablePaging="true">
</asp:ObjectDataSource>
</form>
</body>
</html>
Como seria de esperar, é possível combinarmos as operações de ordenação e paginação num único método:
public FuncionarioCollection LoadFuncionarios( string sortColumn, int startIndex, int maxFuncionariosPerPage )
{
if ( string.IsNullOrEmpty( sortColumn ) )
{
return LoadFuncionarios( startIndex, maxFuncionariosPerPage );
}
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( );
int i = 0;
int count = 0;
SqlDataReader reader = cmd.ExecuteReader( CommandBehavior.CloseConnection );
while ( reader.Read( ) && count < maxFuncionariosPerPage )
{
if ( i < startIndex )
{
i++;
continue;
}
funcionarios.Add( new Funcionario( reader.GetInt32( 0 ), reader.GetString( 1 ), reader.GetString( 2 ), reader.GetString( 3 ) ) );
count++;
}
reader.Close( );
}
return funcionarios;
}
A implementação do método é extremamente simples e limita-se a reaproveitar os principios apresentados nos métodos anteriores. Tal como acontecia com o método que apenas efectuava a ordenação, este método começa por verificar a validade do parâmetro sortColumn. A utilização de um valor inválido neste parâmetro faz com que o método apresentado no inicio deste post seja executado. No próximo post vamos falar acerca da última opção que possuímos sobre a selecção de elementos: o caching.
posted on Thursday, June 30, 2005 11:25 PM