ListView è DataPager

è arrivato il Framework 3.5 e con lui una nuova versione di asp.net, la new entry più gradita è certamente il nuovo controllo ListView.

il ListView ha il non trascurabile pregio di unire la flessibilità del Repeater in quanto a definizione del layout, e le funzionalità evolute del GridView, come la paginazione.

in particolare la paginazione è interessante, in quanto svincolata dal controllo stesso e fornita invece attraverso un nuovo controllo, il DataPager.

il DataPager ha tra le sue caratteristiche la possibilità di visualizzare un numero variabili di campi utili alla navigazione tra le pagine, cose come l'avanti, indietro, numeri di pagina ecc ecc.

se nessuno dei campi preconfezionati si adattasse alla nostra veste grafica possiamo sempre ricorrere ha campi personalizzati o ad una Template.

la TemplatePagerField permette di dare libero sfogo alla vostra fantasia, Button, Link, DropDownList e chi più ne ha più ne metta.

ma ai me...dopo dovrete fare lo sporco lavoro di comunicare la nuova pagina e altre cosette al controllo da paginare, cosa che con il DataGrid in pensione non siamo più abituati a fare.

visto che uno in un progetto sicuramente utilizzeremo più di una volta il DataPager, e che con altrettanta probabilità lo utilizzeremo in tutti i nostri progetti, mi sono preso la briga di realizzarne uno che usa come Ui un UserControl.

la prima cosa da fare è estendere la classe TemplatePagerField:



namespace Soluzioni4D.WebControl
{
public class CustomTemplatePagerField : TemplatePagerField
{
public string PageTemplatePath
{
get
{
if (ViewState["PageTemplatePath"] == null)
{
return Resources.Navigation.PagerWebUserControl;
}
return (string)ViewState["PageTemplatePath"];
}
set { ViewState["PageTemplatePath"] = value; }
}

public override ITemplate PagerTemplate
{
get
{
return null;
}
set
{
throw new NotSupportedException();
}
}

public override void CreateDataPagers(DataPagerFieldItem container, int startRowIndex, int maximumRows, int totalRowCount, int fieldIndex)
{
base.CreateDataPagers(container, startRowIndex, maximumRows, totalRowCount, fieldIndex);

if (!string.IsNullOrEmpty(PageTemplatePath))
{
IPagerAccessor _control = container.Page.LoadControl(PageTemplatePath) as IPagerAccessor;

if (_control != null)
{
_control.PageSize = container.Pager.PageSize;
_control.StartRowIndex = container.Pager.StartRowIndex;
_control.TotalRowCount = container.Pager.TotalRowCount;
container.Controls.Add((Control)_control);
}
}
}

protected override void OnPagerCommand(DataPagerCommandEventArgs e)
{

switch (e.CommandName)
{
case "Next":
int _newNextIndex = e.Item.Pager.StartRowIndex + e.Item.Pager.PageSize;

if (_newNextIndex <= e.TotalRowCount)
{
e.NewStartRowIndex = _newNextIndex;
e.NewMaximumRows = e.Item.Pager.MaximumRows;
}

break;
case "Previus":
int _newPreviusIndex = e.Item.Pager.StartRowIndex - e.Item.Pager.PageSize;

if (_newPreviusIndex >= 0)
{
e.NewStartRowIndex = _newPreviusIndex;

e.NewMaximumRows = e.Item.Pager.MaximumRows;
}
break;

}
}
}
}

la proprietà PageTemplatePath contiene il percorso dell'UserControl, se non impostato ne restituisce uno predefinito.

nel metodo CreateDataPager recuperiamo l'UserControl e impostiamo alcuni parametri, usi l'interfaccia IPagerAccessor perche nel mio UserControl voglio utilizzare alcune proprietà del DataPager.

infine il lavoro sporco e ripetitivo che saremmo stato costretti a inserire in ogni pagina, viene eseguito nel metodo OnPagerCommand.

infine l'UserControl, il codice è semplice :

public partial class Shared_UserControl_PagerWebUserControl : UserControlBase<object>, IPagerAccessor
{
public int TotalRowCount { get; set; }

public int StartRowIndex { get; set; }

public int PageSize { get; set; }
}

ci limitiamo a implementare l'interfaccia IPagerAccessor, è una mia interfaccia il suo utilizzo è facoltativo è utile solo perche devo accedere al numero totale di pagina ed al numero di elementi

infien L'userControl vero e proprio:



<%--Tasto indietro--%>

<asp:LinkButton CssClass="PreviusButton" runat="server" CommandName="Previus" ID="_previusLinkButton">
<span>
<asp:Literal ID="Literal1" runat="server" Text="<%$ Resources:Shared, Indietro %>" />
</span>
</asp:LinkButton>
<%-- Pagine --%>

<div class="PagerInfo">
<div>
<span>
<asp:Literal ID="_pageLabel" runat="server" Text="<%$ Resources:Shared, Pagina %>"></asp:Literal>
</span>
<span>
<asp:Literal ID="_currentPage" runat="server" Text="<%# TotalRowCount>0 ? (StartRowIndex / PageSize) + 1 : 0 %>"></asp:Literal>
</span>
</div>
<div>
<span>
<asp:Literal ID="_ofPageLabel" runat="server" Text="<%$ Resources:Shared, PaginaDi %>"></asp:Literal>
</span>
<span>
<asp:Literal ID="_totalPages" runat="server" Text="<%# Math.Ceiling ((double)TotalRowCount / PageSize)%>"></asp:Literal>
</span>
</div>
</div>
<%--Tasto avanti--%>
<asp:LinkButton CssClass="NextButton" runat="server" CommandName="Next" ID="_nextLinkkButton">
<span>
<asp:Literal ID="Literal2" runat="server" Text="<%$ Resources:Shared, Avanti
%>" />
</span>
</asp:LinkButton>

e questo è tutto, se magari non avete la necessità di visualizzare il numero di pagine, e vi limitate al solo tasto avanti e indietro, è possibile non implementare l'interfaccia IPagerAccessor e modificare leggermente il codice della classe CustomTemplatePagerField

Nella stessa categoria

Commenti
Daniele Bochicchio scrive:
Re: ListView è DataPager

Marco Leoncini wrote:
è arrivato il Framework 3.5 e con lui una nuova versione di asp.net, la new entry più gradita è certamente il nuovo controllo ListView.

questo è uno script per unoscript@lgiorno...
19/02/2008 ore 15.39 | 5 risposte
»»»» nostromo scrive:
Re: ListView è DataPager

Daniele Bochicchio ha scritto:

questo è uno script per unoscript@lgiorno...


beccato subito


naturalmente lo pacchettizzo pulisco e lo scriptizzo

azz sul blog non mi rimane che dedicarmi a WPF...dove la P non sta presentation

ciao marco

Modificato da nostromo il 19 febbraio 2008 16.36 -
19/02/2008 ore 16.14 | 1 risposta
imperugo scrive:
19/02/2008 ore 16.30
imperugo scrive:
20/02/2008 ore 13.22
Daniele Bochicchio scrive:
Re: ListView è DataPager

nostromo wrote:
beccato subito
: D

non è che sei andato molto lontano... potevi nasconderti meglio!
19/02/2008 ore 17.35 | 1 risposta
»»»» nostromo scrive:
Re: ListView è DataPager

Daniele Bochicchio ha scritto:

beccato subito
non è che sei andato molto lontano... potevi nasconderti meglio!



LOL pensavo che nel posto dove ero più in vista nessuno mi avrebbe notato

ciao marco

Modificato da nostromo il 19 febbraio 2008 18.23 -
19/02/2008 ore 18.14

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.


TagCloud
BLOG INFO
  • Post: 232
  • Commenti: 103
  • TrackBacks: 23
  • Feed blog e contenuti tecnici: RSS
  • Feed blog: RSS Atom OPML
CATEGORIE
I PIÙ LETTI DEL MESE
IN EVIDENZA