Scatenare l'evento SelectedIndexChanged del controllo RadioButtonList di ASP.NET

Giorgio Borelli

Il Web Server Control RadioButtonList di ASP.NET con selezione di un elemento radioIl controllo RadioButtoList di ASP.NET rientra nella famiglia dei WebServer Control List, ossia di quei controlli che forniscono informazioni a forma di lista. I list control sono tutti accomunati dal fatto che posseggono una proprietà Items per la gestione dei singoli elementi della lista, che nel caso del RadioButtoList si traduce in una lista di pulsanti Radio che consentono di specificare una sola scelta tra quelle possibili.

L'uso del RadioButtoList con l'attributo runat="server" quindi gestito lato server dal .NET Framework facilita l'uso di questo controllo, che in HTML classico deve essere implementato da più button Radio gestiti poi via Javascript, inoltre il RadioButtonList così come tutti i list control si adattano molto bene a gestire automaticamente la rappresentazione di dati derivanti da una qualsiasi sorgente dati (database, xml, ecc...) con un semplice databinding.

L'uso dei RadioButtonList è frequente nelle pagine web, per sondaggi, moduli e scelte di selezione in genere, spesso a questo controllo è necessario associare un'azione al cambio della selezione di un radio button. Questo comportamento viene implementato a mezzo dell'evento SelectIndexChanged del RadioButtonList. Semplicemente all'interno dell'evento SelectIndexChanged andiamo ad inserire il codice lato server per il comportamento che vogliamo generare allo scatenarsi di tale evento; eppure, sebbene possa sembrar un'azione banale l'evento SelectIndexChanged del RadioButtonList una volta implementato non sembra funzionare correttamente, e quasi come se non ci fosse, cosa succede? Come possiamo risolvere?

Supponiamo pertanto di avere il codice dell'evento OnSelectIndexChanged del nostro RadioButtonList:

<asp:RadioButtonList ID="RadioButtonList" runat="server" OnSelectedIndexChanged="RadioButtonList_SelectedIndexChanged">
    <asp:ListItem>Scelta 1</asp:ListItem>
    <asp:ListItem>Scelta 2</asp:ListItem>
    <asp:ListItem>Scelta 3</asp:ListItem>
    <asp:ListItem>Scelta 4</asp:ListItem>
</asp:RadioButtonList>

protectedvoid RadioButtonList_SelectedIndexChanged(object sender, EventArgs e) { //do something }

Ovviamente la prima parte rappresenta il markup del RadioButtonList dove si evidenzia il nome dell'evento, e la secoda parte è il code view per la gestione vera e propria dell'evento OnSelectIndexChanged lato server, al cui interno delle parentesi graffe poniamo il codice per implementare il comportamento desiderato, fai qualcosa (do something) ad es. assegniamo ad una label il valore della scelta selezionata.

Così scritto questo codice non genera il comportamento voluto, alla proprietà Text della label non viene assegnato proprio nulla non appena nella pagina cambiamo selezione, perchè? Eppure tutto sembra scritto correttamente, la pagina viene compilata e non sembrano esserci particolari complicazioni, allora perchè non funziona? Sembra quasi che non entri nell'evento, per accertarcene poniamo un breakpoint all'interno del codice racchiuso dalle parentesi graffe dell'evento OnSelectIndexChanged e lanciamo la pagina da Visual Studio in debug; al cambio della selezione il debug non ci porta al breakpoint, non ci entra proprio, allora il nostro sospetto era fondato, perchè non si scatena l'evento OnSelectIndexChanged del RadioButtonList?

La risposta è davvero semplice, poichè il controllo ASP.NET RadioButtonList per impostazione di default non scatena un PostBack. Basterà specificare AutoPostBack="true" tra le proprietà del RadioButtonList per ottenere il comportamento desiderato, in questo modo:

<asp:RadioButtonList ID="RadioButtonList" runat="server" AutoPostBack="true" ...

MSDN: La proprietà AutoPostBack Ottiene o imposta un valore che indica se si verifica un postback automatico al server quando l'utente modifica la selezione dell'elenco. (Ereditato da ListControl).

Questo significa che quanto spiegato per i RadioButtonList sullo scatenarsi dell'evento al cambio della selezione vale anche per gli altri List Control, come:

  • BulletedList
  • CheckBoxList
  • DropDownList

per tutti questi controlli (oltre che per il RadioButtonList) bisogna attenzionare che la proprietà AutoPostBack sia impostata a true per veder scatenarsi l'evento OnSelectIndexChanged.

Se invece volessimo gestire l'evento del cambio di selezione senza sollevare il PostBack della pagina ed evitare questo noioso refresh? Allora dobbiamo intervenire via Ajax, ma questa è un'altra storia.

Chiunque voglia aggiungere qualcosa o chiedere ulteriori chiarimenti su Come scatenare l'evento OnSelectIndexChanged nel RadioButtonList e nei ListControl di ASP.NET in genere, può farlo tramite i commenti, ogni vostro contributo alla discussione sarà ben accetto.

Categorie: .NET framework | ASP.NET

Tags: ,

Aggiungi Commento

biuquote
Loading