Procedura: individuare i controlli Web Form di una pagina nell'insieme Controls
Aggiornamento: novembre 2007
Ogni controllo contenitore presente nella pagina, così come la pagina stessa, contiene un'insieme Controls che può essere utilizzato per individuare singoli controlli.
Per individuare un controllo nell'insieme Controls
Scorrere in ciclo l'insieme Controls del controllo contenitore. L'insieme è del tipo ControlCollection e restituisce oggetti di tipo Control.
Nell'esempio riportato di seguito viene illustrato come scorrere in ciclo l'insieme Controls. Si presuppone che esista una pagina Web ASP.NET contenente al suo interno almeno un controllo TextBox, un controllo Label e un controllo Button. Nel codice vengono recuperati tutti i controlli figlio dell'oggetto Page. Poiché in tal modo vengono individuati solo pochi controlli figlio di alto livello, tra cui l'oggetto HtmlForm, viene scorso in ciclo anche l'insieme Controls di ciascun controllo figlio. Vengono cercate le caselle di testo confrontando il tipo di ciascun controllo. Quando viene trovata una casella di testo, il valore di tale casella viene recuperato e concatenato in una stringa che, al termine, viene visualizzata in un controllo Label.
In questo esempio vengono individuati solo i controlli contenuti nell'oggetto Page e i controlli figlio diretti della pagina. Non vengono individuate le caselle di testo figlio di controlli a loro volta figlio della pagina. Se, ad esempio, si aggiunge un controllo Panel alla pagina, il controllo Panel sarà figlio del controllo HtmlForm contenuto in Page e verrà individuato nell'esempio. Se tuttavia si aggiunge un controllo TextBox nel controllo Panel, il testo del controllo TextBox non verrà visualizzato dall'esempio in quanto non è un figlio della pagina né di un controllo figlio della pagina. Un modo più pratico di scorrere in ciclo i controlli consiste nel creare un metodo ricorsivo che possa essere chiamato per scorrere in ciclo l'insieme Controls di ogni controllo che viene via via rilevato. Nell'esempio riportato di seguito, tuttavia, per chiarezza, non si utilizza una funzione ricorsiva.
Private Sub Button1_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles Button1.Click Dim allTextBoxValues As String = "" Dim c As Control Dim childc As Control For Each c In Page.Controls For Each childc In c.Controls If TypeOf childc Is TextBox Then allTextBoxValues &= CType(childc, TextBox).Text & "," End If Next Next If allTextBoxValues <> "" Then Label1.Text = allTextBoxValues End If End Sub
private void Button1_Click(object sender, System.EventArgs e) { string allTextBoxValues = ""; foreach (Control c in Page.Controls) { foreach (Control childc in c.Controls) { if (childc is TextBox) { allTextBoxValues += ((TextBox)childc).Text + ","; } } } if (allTextBoxValues != "") { Label1.Text = allTextBoxValues; } }