ASP.NET: i List Controls – Lavorare con gli insiemi di dati

Corso ASP.NET: settima puntata

Esempio funzionante | Sorgente | Scarica il sorgente (zip)

I List Controls sono dei controlli creati per agire sui dati. Sono utilizzati per visualizzare dati provenienti da collezioni e da database.

Anche se l’esempio che segue utilizza delle collezioni di dati fittizie per popolare i List Controls, il procedimento è il medesimo qualunque sia la sorgente dati a cui connettersi.

Una pagina con List Controls

Ecco alcuni List Controls:

Alcuni List Controls

Si tratta di ComboBox, CheckBox e Radio Buttons.

ASP.NET semplifica enormemente la costruzione del “legame” tra codice e dati, favorendo il più possibile la separazione tra codice e contenuto.

Analizziamo quindi il codice sorgente delle parti significative della pagina:

 90     <div class="titolo">DropDownList Control</div>
 91     
 92      <p>Selezionare una voce dall’elenco</p>
 93 
 94      <asp:DropDownList id="frutti" runat="server">
 95        <asp:ListItem value="Fr">Fragola</asp:ListItem>
 96        <asp:ListItem value="La">Lampone</asp:ListItem>
 97        <asp:ListItem value="Ci">Ciliegia</asp:ListItem>
 98      </asp:DropDownList>
 99 
100      <br /><br />
101 
102      <asp:Button id="button1" Text="Invia" OnClick="Button1_Click" runat="server"/>

Nel codice sopra riportato non è presente niente di eccezionale. È dichiarato un controllo di tipo DropDownList contenente alcuni controlli ListItem. Lo scopo è quello di realizzare una serie di tag di tipo select. Conclude il codice (riga 102) un pulsante per l’invio della selezione.

106     <div class="titolo">ListBox Control</div>
107 
108      <p>Selezionare una voce dall’elenco</p>
109 
110      <asp:ListBox id="artisti" rows="2" selectionmode="Multiple" runat="server">
111        <asp:ListItem value="Pi">Picasso</asp:ListItem>
112        <asp:ListItem value="Kl">Klee</asp:ListItem>
113        <asp:ListItem value="Mo">Modigliani</asp:ListItem>
114      </asp:ListBox>
115 
116      <br /><br />
117 
118      <asp:Button id="button2" Text="Invia" OnClick="Button2_Click" runat="server"/>

Qui è invece dichiarato un oggetto di tipo ListBox, molto simile al DropDownList, ma che presenta i dati su più righe. Notare la presenza dell’attributo selectionmode=”Multiple” che consente la selezione di più voci tenendo premuto il pulsante Ctrl.

Agire sui List Controls da codice

Se osserviamo con attenzione il codice e lo confrontiamo con il risultato a video, notiamo che:

  • a video la DropDownList contiene un valore “Mango” non presente nel codice
  • a video la ListBox contiene 3 artisti (Dalì, Magritte, Mirò) non presenti nel codice

Gli elementi mancanti sono stati aggiunti da codice, in particolare nell’evento Page_Load:

 17 Sub Page_Load(sender as Object, e as EventArgs)
 18 
 19   ‘Se il Mango non e’ gia’ presente, lo aggiungo
 20   Dim lsiFrutto as New ListItem("Mango","Ma")
 21   If Not frutti.Items.Contains(lsiFrutto) Then
 22    frutti.Items.Add(lsiFrutto)
 23  End If
 24 
 25   ‘Aggiungo altri artisti
 26  Dim i as integer
 27  Dim aArtisti As String(,) = New String(,) {{"Dal","Da"}, {"Magritte","Ma"}, {"Mir","Mi"}}
 28 
 29  For i = 0 to UBound(aArtisti)
 30     If Not artisti.Items.Contains(New ListItem(aArtisti(i,0),aArtisti(i,1))) Then
 31      artisti.Items.Add(New ListItem(aArtisti(i,0),aArtisti(i,1)))
 32    End If
 33   Next i
 34   
 35 End Sub

Nel primo caso è controllata la presenza di una voce “Mango” nell’insieme Items dell’oggetto “frutti”; nel caso non sia trovata è aggiunta all’elenco.

Nel secondo caso il procedimento è leggermente più complesso, ma la filosofia di fondo non cambia:

  • è dichiarato un array con i tre artisti
  • con un ciclo è controllata la presenza di uno dei tre artisti tra quelli già presenti
  • se l’artista non è già presente viene aggiunto alla lista

L’esempio ha evidentemente poco senso in un caso reale, ma dimostra una volta di più come il codice Visual Basic rimanga ben separato dal codice Html della pagina.

L’ultimo List Control presentato sulla pagina è il RadioButtonList Control. Niente di nuovo rispetto a quanto già visto, a parte la possibilità di ordinare verticalmente od orizzontalmente i radio button. Lo rende disponibile la linea:

137  <asp:CheckBox id="chkOrientamento" class="txt" OnCheckedChanged="chkOrientamento_CheckedChanged" AutoPostBack="true" Text="Orizzontale" runat="server" />

Non appena si clicca per cambiare l’ordinamento è richiamato l’evento chkOrientamento_CheckedChanged che alternativamente imposta la proprietà RepeatDirection:

 62 Sub chkOrientamento_CheckedChanged(sender As Object, e As EventArgs)
 63   If sender.Checked = True Then
 64     sport.RepeatDirection = RepeatDirection.Horizontal
 65   Else
 66     sport.RepeatDirection = RepeatDirection.Vertical
 67   End If
 68 End Sub

Invio della form

Ma che cosa succede quando premiamo “invia” nella form?

 37 Sub Button1_Click(sender As Object, e As EventArgs)
 38   risposta.Text = "Hai selezionato ‘" & frutti.SelectedItem.Text & "’ con valore ‘" & frutti.SelectedItem.Value & "’."
 39 End Sub

Nel primo caso (DropDownList) è utilizzato l’oggetto SelectedItem per risalire all’elemento selezionato.


 41 Sub Button2_Click(sender As Object, e As EventArgs)
 42   
 43   Dim objElemento as ListItem
 44   Dim strMessaggio as String
 45   
 46   For Each objElemento in artisti.Items
 47     If objElemento.Selected Then
 48       strMessaggio += "Hai selezionato ‘" & objElemento.Text & "’ con valore ‘" & objElemento.Value & "’.<br />"
 49     End If
 50   Next

Nel caso del ListBox control è necessario invece ciclare tra tutti i possibile elementi, perché ne possono essere stati selezionati più d’uno.

 56 Sub Button3_Click(Source As Object, e As EventArgs)
 57  If sport.SelectedIndex > – 1 Then
 58  risposta.Text = "Hai selezionato il radiobutton ‘" & sport.SelectedItem.Text & "’."
 59  End If
 60 End Sub

Infine, il RadioButtonList control ha un comportamento molto simile al DropDownList Control.

Sommario

I List Controls sono un comodo strumento per visualizzare insiemi di dati. Evitano la stesura di cicli contenenti codice ed Html, rappresentando un’ottima soluzione per praticare la separazione codice/contenuti.