La semplicità e la potenza del DataGrid spesso nascondono quelli che sono i problemi di questo controllo (lentezza, pesantezza del ViewState, output poco personalizzabile). Il vero problema è che spesso i problemi che questa crea non sono nemmeno considerati dallo sviluppatore (Funziona?? Si!! Allora tutto a posto). Quando si devono creare applicazioni "serie", il controllo ideale è il repeater. Questo però non offre le stesse potenzialità di servizi del fratello maggiore. (Paging e Sorting).
Il sorting è una feature abbastanza semplice da implementare, inserendo degli HyperLink nella sezione HeaderTemplate. Per il paging la cosa è altrettanto semplice da implementare, ma va ripetuta allo sesso modo su ogni Repeater dell'applicazione.
Daniele qui ha dato la sua idea su come migliorare le cose. Lui sfrutta i parametri passati nell'url per effettuare la paginazione, io invece propongo un CustomControl che esegue un PostBack della pagina.
L'idea, come per lo script di Daniele, non è quella di iniettare dei controlli nel Repeater, bensì di creare un secondo controllo completamente indipendente che si può mettere ovunque.
Il controllo deriva da PlaceHolder, implementa INamingContainer ed espone 2 proprietà e un evento. La prima proprietà indica il numero attuale della pagina, e la seconda il numero totale di pagine. L'evento notifica quando si è effettuato il cambio di pagina passando come parametro una classe che deriva da EventArgs che in più espone il nuovo numero di pagina (Stesso metodo del datagrid). Il metodo CreateChildControls viene overridato per riprodurre lo stato dei controlli creati dinamicamente nella precedente richiesta e far scattare così gli eventi in maniera corretta. Infine viene overridato anche il metodo Render per ridisegnare gli oggetti in base al numero di pagina specificato nell proprietà.
La parte core del controllo è quella che crea i bottoni per la paginazione.
private void FillPager(){ this.Controls.Clear(); for (int i = 0; i < PageCount; i++){ if ((i + 1) == PageIndex){ LiteralControl l = new LiteralControl(); l.Text = Convert.ToString(i + 1); this.Controls.Add(l); } else{ LinkButton l = new LinkButton(); l.Text = Convert.ToString(i + 1); l.ID = this.UniqueID + "lk" + i; l.CommandArgument = l.Text; this.Controls.Add(l); } this.Controls.Add(new LiteralControl(" ")); } }
Nel prossimo post ci sarà anche la parte relativa al sollevamento dell'evento.
Stay tuned...
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
- Entity Framework è lento! mmmmh, probabilmente sei tu che lo stai usando male!, il 7 ottobre 2022 alle 10:55
- Cosa penso di ASP.NET vNext, il 3 settembre 2014 alle 09:00
- E così AngularJS e DurandalJS convergono..., il 7 maggio 2014 alle 11:51
- Usare fiddler per simulare le risposte da un servizio, il 28 ottobre 2013 alle 08:00
- Tip: cosa fare quando Entity Framework Code-First Migrations smette di funzionare, il 18 gennaio 2013 alle 11:04
- Visual Studio 11 beta: le novità di Entity Framework 5.0 e WCF 4.5, il 2 marzo 2012 alle 23:08