andrea25 ha scritto:
questo era un esempio per le label.text ma non ha funzionato, mi dava errore su myControl (e Controls.OfType se non ricordo male).
ricordo di aver usato anche il controls.find ma non ha funzionato e non capisco il perchè:
Tutti gli esempi o approci che ti hanno consigliato o hai tentato devono funzionare, se non sei riuscito hai sbagliato la sintassi, oppure cercavi un controllo dove non c'era.
Ti informo che in VB.Net, ma anche in C#, i controlli sono sempre parte di matrici, il problema è che l'indice è determinato dalla posizione nel designer e che tale posizione non dipende da quando il controllo è stato inserito, ma è arbitrario, si potrebbero riordinare i controlli nel designer, ma poi ad ogni nuovo inserimento in progettazione, l'indice potrebbe cambiare, generando sicuri malfunzionameti, per questo è sconsiglaiato.
Ma l'approcio più logico per un programmatore che ha 20, 30, 40 Text, gestibili con dei cicli, è avere le text in una matrice e identificarle con l'indice.
Per avere la certezza che una text o qualsiasi altro controllo, posizionati sul form abbiano sempre lo stesso indice è crearli e posizionarli in runtime.
Public Class Form1
Dim TextIN(19) As TextBox ' matrice di Text
Dim Label1(19) As Label ' matrice di Label
Dim Label2(19) As Label ' matrice di Label
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Me.Size = New Size(470, 554)
' riempio tre Array di controlli e li aggiungo al Form
For riga = 0 To 19
TextIN(riga) = New TextBox ' creo le textbox
TextIN(riga).Name = "TexIN" & riga.ToString("00") ' nome composto
TextIN(riga).Left = 10
TextIN(riga).Top = 10 + riga * 25
TextIN(riga).Tag = riga ' fa comodo per risolvere l'indice
Me.Controls.Add(TextIN(riga)) ' aggiungo la text
AddHandler TextIN(riga).Click, AddressOf TextIN_OnClick ' permette di avere l'evento click
Label1(riga) = New Label ' creo le label1
Label1(riga).Name = "Label1" & riga.ToString("00") ' nome composto
Label1(riga).Left = 120
Label1(riga).Top = 10 + riga * 25
Label1(riga).Tag = riga ' fa comodo per risolvere l'indice
Label1(riga).BackColor = Color.LightGray
Me.Controls.Add(Label1(riga)) ' aggiungo la text
AddHandler Label1(riga).Click, AddressOf Label1_OnClick ' permette di avere l'evento click
Label2(riga) = New Label ' creo le label2
Label2(riga).Name = "Label2" & riga.ToString("00") ' nome composto
Label2(riga).Left = 230
Label2(riga).Top = 10 + riga * 25
Label2(riga).Tag = riga ' fa comodo per risolvere l'indice
Label2(riga).BackColor = Color.WhiteSmoke
Label2(riga).AutoSize = True
Me.Controls.Add(Label2(riga)) ' aggiungo la text
AddHandler Label2(riga).Click, AddressOf Label2_OnClick ' permette di avere l'evento click
Next riga
' posso usare i cicli per modificare qualsiasi proprietà
For rig = 0 To 19
Label1(rig).Text = "cliccami"
TextIN(rig).Text = "scrivi su " & TextIN(rig).Name
Next rig
End Sub
Private Sub TextIN_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
' solo d'esempio
Dim ClicX As Integer = sender.Left ' coordinata X della text cliccata
Dim ClicY As Integer = sender.Top ' coordinata Y della text cliccata
Dim Indice As Integer = sender.tag() ' indice della text cliccata
Dim NomeText As String = sender.name ' nome della Text
sender.text = "cliccato " & Indice.ToString("00")
Me.Text = "riga " & Indice
End Sub
Private Sub Label1_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
' solo d'esempio
Dim ClicX As Integer = sender.Left ' coordinata X della Label1 cliccata
Dim ClicY As Integer = sender.Top ' coordinata Y della Label1 cliccata
Dim Indice As Integer = sender.tag() ' indice della Label1 cliccata
Dim NomeLabel1 As String = sender.name ' nome della Label1
sender.text = "cliccato"
' con gli indici si schiude un mondo
Label2(Indice).Text = "nella " & TextIN(Indice).Name & " c'è scritto: " & TextIN(Indice).Text
Me.Text = "riga " & Indice
End Sub
Private Sub Label2_OnClick(ByVal sender As System.Object, ByVal e As System.EventArgs)
' solo d'esempio
Dim ClicX As Integer = sender.Left ' coordinata X della Label2 cliccata
Dim ClicY As Integer = sender.Top ' coordinata Y della Label2 cliccata
Dim Indice As Integer = sender.tag() ' indice della Label2 cliccata
Dim NomeLabel1 As String = sender.name ' nome della Label2
sender.text = "cliccato"
Me.Text = "riga " & Indice
End Sub
End Class
Con tale approcio, non dovrai ogni volta cercare il controllo giusto con For Each.
Quando avrai necessità più articolate, ti consiglio di guardarti come si crea e si usa un UserControl.
Ora sarebbe fuori argomento.