in

dotNet Umbria

Il primo User Group in Umbria sul mondo .Net

Articoli

Articoli vari degli iscritti a DotNetUmbria

Paginazione Lato Server Parte 3 - Oggetti che non supportano la paginazione con ricerca

Il seguente articolo si pone come obbiettivo la riutilizzazione delle logiche implementate nei due articoli precedenti (Parte 1 - Oggetti che supportano la paginazioneParte 2 - Ricerca negli oggetti che supportano la paginazione) per fare in modo che esse siano fruite anche da quegli oggetti che non supportano nativamente la paginazione.

Un esempio classico di applicazione delle suddette logiche potrebbe essere l'uso del Data List, per presentare liste con un accattivante aspetto grafico in quanto altamente personalizzabile dal punto di vista estetico. Pensiamo ad esempio alla nostra lista di prodotti: quale miglior oggetto se non il Data List per presentare i prodotti al pubblico, magari correlati da foto?
Lo scopo di questo articolo non è, sia chiaro, il layout grafico. Come si sarà notato anche negli articoli precedenti non ho implementato alcuna forma di layout legato ai CSS o agli Skin. Ritengo sia più opportuno lasciare questa parte ai grafici.

Come al solito potete scaricare il progetto aggiornato direttamente da qui GPExamples3.zip

Per iniziare facciamo una copia di PaginazioneGridView.aspx denominandola PaginazioneDatalist.aspx; nel codice elimineremo solo la parte riguardante la GridView e la sostituiremo con un oggetto Datalist in modo che il risultato finale sia il seguente: 

[code language="ASPX"]

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="PaginazioneDatalist.aspx.cs" Inherits="PaginazioneDatalist" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <table width="100%">
            <tr>
                <td style="height: 26px">
                    <asp:Label ID="lblidProdotto" runat="server" Text="ID Prodotto:"></asp:Label>
                </td>
                <td style="height: 26px">
                    <asp:TextBox ID="txtidProdotto" runat="server"></asp:TextBox>&nbsp;
                </td>
                <td style="height: 26px">
                    <asp:Label ID="lblnomeProdotto" runat="server" Text="Nome Prodotto:"></asp:Label>
                </td>
                <td style="height: 26px">
                    <asp:TextBox ID="txtnomeProdotto" runat="server"></asp:TextBox>
                </td>
                <td style="height: 26px">
                    <asp:Label ID="lbldescProdotto" runat="server" Text="Descrizione Prodotto:"></asp:Label>
                </td>
                <td style="height: 26px">
                    <asp:TextBox ID="txtdescProdotto" runat="server"></asp:TextBox>
                </td>
                <td style="height: 26px">
                    <asp:Label ID="lblmodelloProdotto" runat="server" Text="Modello Prodotto:"></asp:Label>
                </td>
                <td style="height: 26px">
                    <asp:TextBox ID="txtmodelloProdotto" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td colspan="8">
                    <asp:Button ID="btnRicerca" runat="server" Text="Ricerca" OnClick="btnRicerca_Click" />
                </td>
            </tr>
        </table>
        <asp:DataList ID="dlProdotti" runat="server" DataSourceID="odsProdotti" GridLines="Both" RepeatColumns="3" RepeatDirection="Horizontal">
            <ItemTemplate>
                <div>
                    <%# Eval("idProdotto")%>   
                </div>
                <div>
                    <%# Eval("nomeProdotto")%>   
                </div>
                <div>
                    <%# Eval("descProdotto")%>   
                </div>
                <div>
                    <%# Eval("modelloProdotto")%>   
                </div>
            </ItemTemplate>
        </asp:DataList>
        <asp:Button ID="btnAvanti" runat="server" Text="Avanti" OnClick="btnAvanti_Click" />
        <asp:Button ID="btnIndietro" runat="server" Text="Indietro" OnClick="btnIndietro_Click" />
    </div>
        <asp:ObjectDataSource ID="odsProdotti" runat="server" OldValuesParameterFormatString="original_{0}"
        SelectCountMethod="GetProdottiPaginatiCount" SelectMethod="GetProdottiPaginati"
        SortParameterName="sortColumn" TypeName="GPExamples.Oggetti.ProdottiFacade" EnablePaging="True" MaximumRowsParameterName="numRows" OnSelecting="odsProdotti_Selecting">
            <SelectParameters>
                <asp:Parameter DefaultValue="0" Name="startRowIndex" Type="Int32" />
                <asp:Parameter DefaultValue="10" Name="numRows" Type="Int32" />
                <asp:Parameter Name="sortColumn" Type="String" />
                <asp:Parameter Name="sortDirection" Type="String" />
                <asp:Parameter Name="sortExpression" Type="String" />
            </SelectParameters>
    </asp:ObjectDataSource>
    </form>
</body>
</html>

[/code]

Passiamo ora ad occuparci del code behind.
La sostanziale differenza di questo tratto è che dovremmo occuparci noi di mandare le "pagine" avanti e indietro a seconda della richiesta dell'utente.
Noterete che per fare ciò non abbiamo implementato i metodi nella PageBase, in quanto si ipotizza che in un contesto reale la paginazione sia un qualsiasi tipo di controllo dunque, posto nella pagina, dovrebbe essere trattato come un mero oggetto.

Quello che dobbiamo fare è semplicemente inventare un meccanismo per persistere i valori riguardanti la pagina attuale e il numero di righe per ogni pagina.
Per fare ciò inseriamo nel View State due variabili in modo da poterne persistere i valori durante i postback. Questi due valori verranno modificati dai bottoni "avanti" e "indietro"; inoltre nell'evento Selecting dell'Object Data Source faremo in modo che l'oggetto in questione ricevi i valori del View State in modo che possa passarli ai metodi, che successivamente gli restituiranno i nuovi valori richiesti.

Una volta ultimate le modifiche il code behind risulterà così:

 

[code language="C#"]

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;

public partial class PaginazioneDatalist : PageBase
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            SortColumn = "idProdotto";
            SortDirection = "ASC";
            ViewState.Add("MaximumRows", 6);
            ViewState.Add("StartRowIndex", 0);
        }
    }

    protected void ricerca()
    {
        string idProdotto = this.txtidProdotto.Text.Trim();
        string nomeProdotto = this.txtnomeProdotto.Text.Trim();
        string descProdotto = this.txtdescProdotto.Text.Trim();
        string modelloProdotto = this.txtmodelloProdotto.Text.Trim();

        odsProdotti.SelectParameters["sortExpression"].DefaultValue = idProdotto + ";" + nomeProdotto + ";" +
            descProdotto + ";" + modelloProdotto;
    }

    protected void ResettaPaginazione()
    {
        SortDirection = "ASC";
        ViewState["MaximumRows"] = 6;
        ViewState["StartRowIndex"] = 0;
    }

    protected void odsProdotti_Selecting(object sender, ObjectDataSourceSelectingEventArgs e)
    {
        e.Arguments.MaximumRows = (int)ViewState["MaximumRows"];
        e.Arguments.StartRowIndex = (int)ViewState["StartRowIndex"];
    }

    protected void btnAvanti_Click(object sender, EventArgs e)
    {
        ViewState["StartRowIndex"] = (int)ViewState["StartRowIndex"] + (int)ViewState["MaximumRows"];
        dlProdotti.DataBind();
    }

    protected void btnIndietro_Click(object sender, EventArgs e)
    {
        if ((int)ViewState["StartRowIndex"] <= 0)
        { }
        else
        {
            ViewState["StartRowIndex"] = (int)ViewState["StartRowIndex"] - (int)ViewState["MaximumRows"];
            dlProdotti.DataBind();
        }
    }

    protected void btnRicerca_Click(object sender, EventArgs e)
    {
        ricerca();
        ResettaPaginazione();
    }
}

[/code]

Et voilà il gioco è fatto!

Paginazione Lato Server Parte 1 - Oggetti che supportano la paginazione

Paginazione Lato Server Parte 2 - Ricerca negli oggetti che supportano la paginazione

Paginazione Lato Server Parte 4 - Using Singleton Collections

Only published comments... Dec 09 2007, 10:00 AM by Gian Paolo Santopaolo
dotNet Umbria 2007-2008
Powered by Community Server (Commercial Edition), by Telligent Systems