LA.Net
Reflexões sobre C#, .Net e programação em geral

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
Comments
Title  
Name  
Url
Box Code
Protected by FormShield
Comments