ListView è DataPager

di Marco Leoncini, in asp.net,

è 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

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese