Matrici di controlli per gli utenti di Visual Basic 6.0

Aggiornamento: novembre 2007

Benché le matrici di controlli non siano più supportate in Visual Basic 2008, mediante il modello di eventi è possibile emulare e attingere alla maggior parte delle funzionalità delle matrici di controlli.

Differenze concettuali

In Visual Basic 6.0 le matrici di controlli possono essere utilizzate per gestire i controlli di un form; esse, inoltre, consentono di condividere i gestori eventi, di scorrere i gruppi di controlli e di aggiungere controlli in fase di esecuzione.

In Visual Basic 2008 le matrici di controlli non sono più supportate. Le modifiche al modello di eventi, infatti, ne rendono inutile l'utilizzo. Mediante .NET Framework, inoltre, è possibile disporre delle stesse funzionalità offerte dai controlli.

Condivisione dei gestori eventi

In Visual Basic 6.0 era possibile utilizzare le matrici di controlli per specificare un gruppo di controlli che condividevano una serie di eventi. Era necessario che i controlli fossero dello stesso tipo e che avessero lo stesso nome.

In Visual Basic 2008 tutti i gestori eventi possono gestire gli eventi di più controlli, perfino dei controlli con nomi differenti e di tipo diverso.

È ad esempio possibile aggiungere due controlli Button (Button1 e Button2) e un controllo CheckBox (CheckBox1) a un form, quindi creare un gestore eventi per gestire l'evento Click per tutti i tre controlli.

Private Sub MixedControls_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click, Button2.Click, CheckBox1.Click

Scorrimento dei controlli

Un'altra funzionalità delle matrici di controlli di Visual Basic 6.0 consisteva nella possibilità di scorrere un gruppo di controlli mediante la proprietà Index. Ad esempio, per eliminare il testo relativo a tutti i controlli TextBox contenuti in una matrice di controlli era possibile scorrere la matrice utilizzando la proprietà Index come variabile del ciclo.

Anche se in Visual Basic 2008 i controlli non presentano la proprietà Index, è comunque possibile scorrere i controlli di un form o di un contenitore utilizzando la classe Control.ControlCollection della classe Control.

In Visual Basic 6.0 i controlli di una stessa matrice di controlli potevano trovarsi in più contenitori. Ad esempio, i controlli TextBox contenuti in due diversi controlli Frame potevano far parte della stessa matrice di controlli.

In Visual Basic 2008, l'insieme Controls restituisce solo i controlli contenuti in un unico contenitore. Occorre scorrere separatamente i controlli di ogni contenitore di controlli. A tale fine è possibile utilizzare una funzione ricorsiva.

Aggiunta di controlli in fase di esecuzione

In Visual Basic 6.0 era possibile aggiungere controlli a una matrice di controlli in fase di esecuzione mediante l'istruzione Load. I controlli dovevano essere dello stesso tipo della matrice di controlli e quest'ultima doveva essere stata creata in fase di progettazione con almeno un elemento. Dopo aver aggiunto il controllo, la proprietà Visible doveva essere impostata su True.

In Visual Basic 2008, i controlli sono aggiunti in fase di esecuzione utilizzando la parola chiave New in un'istruzione Dim e quindi ricorrendo al metodo Add per il contenitore a cui si desidera aggiungere il controllo.

Aggiunta di gestori eventi in fase di esecuzione

In Visual Basic 6.0, quando si aggiungeva un controllo a una matrice di controlli in fase di esecuzione, i nuovi eventi di controllo erano automaticamente gestiti dagli eventi relativi alla matrice di controlli.

In Visual Basic 2008 occorre definire i gestori eventi per i controlli aggiunti in fase di esecuzione. A tale fine è possibile utilizzare l'istruzione AddHandler.

Modifica del codice per le matrici di controlli

Nel codice riportato di seguito vengono illustrate le differenze nelle tecniche di codifica tra Visual Basic 6.0 e Visual Basic 2008.

Condivisione dei gestori eventi

Nell'esempio riportato di seguito si descrive come condividere il gestore eventi Change (TextChanged in Visual Basic 2008) per un gruppo di tre controlli TextBox. In Visual Basic 2008 la clausola Handles del gestore eventi specifica quale controllo sarà gestito dall'evento. Il gestore eventi restituisce un Object generico. Occorre quindi eseguirne il cast nello specifico tipo di oggetto (in questo caso TextBox) che si desidera gestire. A tale fine, utilizzare il metodo DirectCast.

' Visual Basic 6.0

Private Sub Text1_Change(Index As Integer)

Select Case Index

Case 0

MsgBox("The text in the first TextBox has changed")

Case 1

MsgBox("The text in the second TextBox has changed")

Case 2

MsgBox("The text in the third TextBox has changed")

End Select

End Sub

' Visual Basic
Private Sub TextBoxes_TextChanged(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles TextBox1.TextChanged, _
TextBox2.TextChanged, TextBox3.TextChanged
    Select Case DirectCast(sender, TextBox).Name
        Case TextBox1.Name
            MsgBox("The text in the first TextBox has changed")
        Case TextBox2.Name
            MsgBox("The text in the second TextBox has changed")
        Case TextBox3.Name
            MsgBox("The text in the third TextBox has changed")
    End Select
End Sub
Nota:

Il comportamento dell'evento in Visual Basic 2008 è leggermente diverso. L'evento TextChanged viene generato sia quando ogni controllo viene inizializzato (ad esempio nell'evento Form_Load) sia quando si apportano modifiche al testo in fase di esecuzione. In Visual Basic 6.0 l'evento Change veniva generato soltanto quando il testo subiva modifiche.

Scorrimento dei controlli

Nel seguente esempio viene mostrata una funzione che consente di scorrere un gruppo di controlli di caselle di testo al fine di eliminarne il contenuto. Nell'esempio relativo a Visual Basic 6.0 la proprietà Index di una matrice di controlli è utilizzata come variabile del ciclo.

In Visual Basic 2008, un oggetto Control viene passato come argomento; tale oggetto presenta un insieme Control.ControlCollection contenente tutti i controlli che si trovano in quel controllo. L'operatore Typeof è utilizzato per determinare se ogni controllo è di tipo TextBox.

Nota:

Gli oggetti Form sono di tipo Control; è anche possibile passare un tipo Form come argomento.

Poiché i controlli nidificati non sono inclusi nell'insieme Control.ControlCollection, si utilizza il metodo HasChildren per determinare se ogni controllo contiene altri controlli e, in tal caso, viene chiamata ricorsivamente la funzione ClearText.

' Visual Basic 6.0

Private Sub ClearText()

For i = 0 To Text1().UBound

Text1(i).Text = ""

Next

End Sub

' Visual Basic
Private Sub ClearText(ByVal container As Control)
    Dim ctrl As Control
    For Each ctrl In container.Controls
        If TypeOf (ctrl) Is TextBox Then
            ctrl.Text = ""
        End If
        If ctrl.HasChildren Then
             ClearText(ctrl)
        End If
    Next
End Sub

Aggiunta di controlli in fase di esecuzione

L'esempio riportato di seguito mostra come aggiungere a un form un controllo casella di testo in fase di esecuzione. In Visual Basic 6.0 il controllo è aggiunto a una matrice di controlli. In Visual Basic 2008 il controllo è aggiunto all'insieme Control.ControlCollection. In Visual Basic 6.0 gli eventi del nuovo controllo TextBox erano gestiti automaticamente dalla matrice di controlli. In Visual Basic 2008, invece, è necessario implementare la gestione degli eventi mediante l'istruzione AddHandler.

In entrambi gli esempi si presume che l'aggiunta del controllo casella di testo alla form sia effettuata in fase di progettazione e, nell'esempio relativo a Visual Basic 6.0, che sia stata creata una matrice di controlli contenente un solo elemento. Nell'esempio relativo a Visual Basic 2008 si suppone inoltre che esista un gestore eventi denominato TextChangedHandler per il primo controllo TextBox.

' Visual Basic 6.0

Private Sub AddControl()

' Add a TextBox as the second element of a control array.

Load Text1(1)

' Set the location below the first TextBox.

Text1(1).Move Text1(0).Left, Text1(0).Top + 500

' Make the new TextBox visible

Text1(1).Visible = True

' Visual Basic
' Declare a new TextBox.
Dim TextBox2 As New TextBox
' Set the location below the first TextBox
TextBox2.Left = TextBox1.Left
TextBox2.Top = TextBox1.Top + 30
' Add the TextBox to the form's Controls collection.
Me.Controls.Add(TextBox2)
AddHandler TextBox2.TextChanged, AddressOf TextChangedHandler

Note sull'aggiornamento

Quando un'applicazione creata in Visual Basic 6.0 viene aggiornata a Visual Basic 2008, tutte le matrici di controlli sono aggiornate in classi di matrici di controlli specializzate nella gestione dei controlli. Queste classi sono contenute nello spazio dei nomi Microsoft.VisualBasic.Compatibility.VB6 e sono utilizzate dagli strumenti di aggiornamento per emulare le funzionalità di Visual Basic 6.0 relative alle matrici di controlli.

Benché sia possibile utilizzare queste classi di matrici di controlli in nuovi progetti sviluppati in Visual Basic 2008, si consiglia di utilizzare invece il modello di eventi e le funzioni di .NET Framework.

Vedere anche

Concetti

Eventi e gestione degli eventi per gli utenti di Visual Basic 6.0

Altre risorse

Controlli Windows Form per gli utenti di Visual Basic 6.0