20 messaggi dal 17 luglio 2001
Salve a tutti mi è venuta la malsana idea di estendere il controllo Repeater per inserire il paging.
Volevo realizzarlo mettendo un nuovo TEMPLATE prima del FOOTERTEMPLATE che attualmente già esiste.
E' possibile estendere il controllo Repeater, mettere il nuovo template e fare in modo di generare il codice all'interno del nuovo tag PAGINGTEMPLATE prima del FOOTERTEMPLATE?

come si potrebbe fare, saluti.
per fare si può fare, qulè la difficoltà maggiore che incontri?

ciao marco

Chi parla senza modestia troverà difficile rendere buone le proprie parole.
Confucio

http://nostromo.spaces.live.com/default.aspx
637 messaggi dal 12 agosto 2005
Ho svolto un lavoro analogo su una DataList, che a sua volta non prevede la paginazione. Il metodo è quello di utilizzare la classe PagedDataSource.
    protected PagedDataSource pds;

    protected void Page_Load(object sender, EventArgs e)
    {
        if (!this.IsPostBack)
        {
            _BindData();
            _BuildPageSelection();
        }
    }

    //Loads all page numbers inside a DropDown
    private void _BuildPageSelection()
    {
        int count = pds.PageCount;
        for (int i = 0; i < count; i++)
        {
            ddlPages.Items.Add((i+1).ToString());
        }
        litPagesCount.Text = pds.PageCount.ToString();
    }

    //Retrieves data
    protected void _BindData()
    {
        //PagedDataSource allows to implement paging for DataList
        pds = new PagedDataSource();
        //Gets all records
        pds.DataSource = "...";
        //Enables paging
        pds.AllowPaging = true;
        //Sets the current page (0 default, otherwise saved in the ViewState)
        pds.CurrentPageIndex = CurrentPage;
        //Number of record per page
        pds.PageSize = 20;
        //Binds data to the repeater
        rep.DataSource = pds;
        rep.DataBind();
    }
    //This page-level variable stores the Current viewed
    //page in the page viewstate.
    public int CurrentPage
    {
        get
        {
            //Look for current page in ViewState
            object o = this.ViewState["_CurrentPage"];
            if (o == null)
                //Default page index is 0
                return 0;
            else
                return (int)o;
        }

        set
        {
            this.ViewState["_CurrentPage"] = value;
        }
    }
    //Performs page selection
    protected void ddlPages_SelectedIndexChanged(object sender, EventArgs e)
    {
        CurrentPage = ddlPages.SelectedIndex;
        _BindData();
    }


I commenti sono in inglese per abitudine, comunque non dovrebbe essere problematico.

1) Si crea un PagedDataSource e vi si caricano tutti i record.
2) Si configura il PagedDataSource con pagina corrente, record per pagina...
3) Si associa il PagedDataSource al Repeater

È però necessario memorizzare la pagina attualmente visualizzata, e per farlo si ricorre ad una variabile a livello di pagina ("CurrentPage"), salvata nel ViewState.

Ultimo, gestire il cambio di pagina. Ho trovato che una DropDown con i numeri di pagina e AutoPostBack è una buona soluzione.

Spero possa essere d'aiuto...
20 messaggi dal 17 luglio 2001
Sei stato d'aiuto perchè non sapevo dell'esistenza del PagedDataSource.
Ho modificato il codice ma ancora non riesco a vedere i risultati sperati, praticamente volevo avere una situazione del genere:
HEADERTEMPLATE
...MIEI TEMPLATE PERSONALIZZATI
ITEMTEMPLATE
ALTERNATING
ITEMTEMPLATE
ALTERNATING
ITEMTEMPLATE
ALTERNATING
....
....
...MIEI TEMPLATE PERSONALIZZATI
FOOTERTEMPLATE

di seguito il codice che ho finora scritto, anche l'EMPTYTEMPLATE che ho creato viene scritto dopo il FOOTERTEMPLATE, come si può fare per metterlo prima del footer?

grazie ancora


[ToolboxData("<{0}:RntDataRepeater runat=server>")]
public class RntDataRepeater : System.Web.UI.WebControls.Repeater
{

private ITemplate _emptyTemplate;
private Int16 _recordsPerPage;
private Int16 _currentPage;
private String _url = string.Empty;

protected PagedDataSource pds;

public RntDataRepeater() : base() {
pds = new PagedDataSource();
pds.AllowPaging = true;
}

public Int32 RecordsPerPage{
get { return pds.PageSize; }
set { pds.PageSize = value; }
}
public Int32 CurrentPage{
get { return pds.CurrentPageIndex; }
set { pds.CurrentPageIndex= value; }
}
public Int32 TotalPages{
get {return pds.PageCount;}

}
public String Url{
get { return _url; }
set { _url = value ; }
}
/// <summary>
/// Esegue il Bind dei dati
/// </summary>
public override void DataBind(){

base.DataSource = pds;
base.DataBind();


}
/// <summary>
/// memorizzo tutti i record nella variable interna
/// </summary>
public override object DataSource{

get{ return base.DataSource;}
set{pds.DataSource = (IEnumerable) value;}

}





/// <summary>
/// Il nuovo template per scrivere anche quando non ci sono risultati
/// </summary>
[PersistenceMode(PersistenceMode.InnerProperty),TemplateContainer(typeof(TemplateControl))]
public ITemplate EmptyTemplate
{
get { return _emptyTemplate; }
set { _emptyTemplate = value; }
}
protected override void Render(HtmlTextWriter output)
{
// se non ci sono dati, istanzio il template
if (this.Items.Count == 0 && EmptyTemplate != null){
EmptyTemplate.InstantiateIn(this);
}
base.Render(output);


}





}

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.