Pipeline di rendering di controllo ASP.NET
Domanda
Ho un problema con un controllo cercapersone che sto costruendo. Il mio codice è il seguente
protected override void CreateChildControls()
{
base.CreateChildControls();
pnl = new Panel { ID = "NewsPager", CssClass = "NewsPager" };
Controls.Add(ddl);
AddPagerControls();
}
AddPagerControls aggiunge una serie di LinkButtons che utilizzano lo stesso gestore di eventi:
private void li_Click(object sender, EventArgs e)
{
selectedValue = ((LinkButton) sender).CommandArgument;
AddPagerControls();
}
Quello che succede ora è che quando aggiungo il " Next " LinkButton, ottiene CommandArgument impostato correttamente usando:
var liNext = new LinkButton {ID = "NewsPagerLinkNext", Text = ">", CommandArgument = (int.Parse(value) + 1).ToString()};
liNext.Click += new EventHandler(li_Click);
pnl.Controls.Add(liNext);
vale a dire. se la pagina corrente è 2, allora il " Successivo " il CommandArgument di button sarà 3 durante il debug del codice. Tuttavia, quando la pagina è stata renderizzata e faccio clic sul pulsante successivo, funzionerà una volta (passando da pagina 1 a 2) ma sarà sempre 2, anche se nel codice è impostato su 3. Quindi qualcosa deve accadere quando il controllo è reso.
Sono un po 'perplesso qui. Ho provato a cambiare la chiamata a AddPagerControls in CreateChildControls in if (! Page.IsPostBack) {AddPagerControls ();} ma poi il gestore eventi non si attiva affatto.
Modifica: P.S.Faccio un pnl.Controls.Clear () quando il metodo AddPagerControls viene chiamato dal gestore eventi, altrimenti i LinkButtons verrebbero aggiunti due volte.
Modifica: P.P.S. Ricolulo i pulsanti di collegamento da aggiungere ogni volta perché devo mostrare solo 5 collegamenti se esistono più pagine, ad esempio
lt &; Lt &; lt &; 2 3 4 5 6 7 & Gt; gt &; gt &;
Soluzione
Quello che non capisco è il motivo per cui si rigenerano continuamente i controlli di paging. Non potresti semplicemente usare un approccio in cui hai i tuoi pulsanti di collegamento & Quot; prev & Quot; e " successivo " e mantieni nella visualizzazione del tuo controllo (come proprietà separate) la pagina corrente che viene visualizzata e la quantità di elementi (cioè le dimensioni della pagina)?
Nel gestore dell'evento esegui quindi le azioni appropriate poiché sai che la tua pagina corrente sarà qualcosa come currentPageIndex+1
o qualcosa di simile. Rigenerare i pulsanti prev / next in ogni momento, specialmente nel gestore l i_Click
non è un buon approccio dal mio punto di vista e questo è anche ciò che può causare i tuoi problemi.