A design, non puoi più creare matrici di controlli, ma non sono
nemmeno più necessarie, perchè puoi ottenere gli stessi comportamenti
(e anche di più) semplicemente usando degli array/collection
convenzionali e i metodi AddHandler/RemoveHandler per gli eventi in
comune.
Fai pure i tuoi copia e incolla normalmente in design; a runtime, se
hai bisogno di raggruppare tutte o gruppi di linee, dichiara un
insieme qualunque (es: Dim MyLines as New List(Of LineShape) e
aggiungili
> A design, non puoi pi� creare matrici di controlli, ma non sono
> nemmeno pi� necessarie, perch� puoi ottenere gli stessi comportamenti
> (e anche di pi�) semplicemente usando degli array/collection
> convenzionali e i metodi AddHandler/RemoveHandler per gli eventi in
> comune.
potresti farmi un esempio pratico?
> Fai pure i tuoi copia e incolla normalmente in design; a runtime, se
> hai bisogno di raggruppare tutte o gruppi di linee, dichiara un
> insieme qualunque (es: Dim MyLines as New List(Of LineShape) e
> aggiungili
non ho capito bene: mi dovrei copia-incollare 1000 lineshape
che saranno lineshape1 lineshape2 lineshape3..etc e poi raggrupparle?
ma non sapendo a priori quante lineshape mi serviranno come fare?
Quando hai parlato di "copia e incolla" e "pre-creare" credevo dicessi
che volevi farle tutte in design-time.
Se vuoi crearle a runtime, allora non è molto diverso da come si
faceva in VB6, semplicemente generi nuove istanze di controlli e, se
vuoi, li raggruppi in uno o più array.
Prendi una form vuota e prova:
Public Class Form1
Dim labelList As New List(Of Label)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
'Esempio basato su Label, ma è analogo per LineShape o qualunque
altro controllo
Dim lbl As Label
For i As Integer = 0 To 100
lbl = New Label
lbl.Name = "MiaLabel" & i
lbl.Text = lbl.Name
lbl.Location = New Point(0, i * 20)
lbl.Size = New Size(100, 20)
'esempio di evento condiviso da tutte le label della lista
AddHandler lbl.Click, AddressOf MiaLabel_Click
'le raggruppiamo in un array per simulare, eventualmente, il
vecchio sistema di VB6
labelList.Add(lbl)
'Aggiungiamo infine ogni controllo alla form stessa
Me.Controls.Add(lbl)
Next
End Sub
Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e
As System.EventArgs)
'in VB6 si usava "Index" per distinguere l'oggetto di una
matrice di controlli,
'in .NET ogni evento riceve "sender" che è un riferimento
all'oggetto stesso
'che ha scatenato l'evento
Dim currentLabel As Label = DirectCast(sender, Label)
For Each lbl As Label In labelList
lbl.BackColor = Me.BackColor
Next
Me.Text = "Click su " & currentLabel.Name
currentLabel.BackColor = Color.LightYellow
End Sub
End Class
Public Class Form1
Dim labelList As New List(Of System.Windows.Forms.Label)
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
Dim Line As Label
For i As Integer = 0 To 100
Line = New System.Windows.Forms.Label
Line.Location = New Point(0, 14 * i)
Line.Size = New System.Drawing.Size(Me.Width, 3)
Line.BackColor = System.Drawing.Color.Blue
AddHandler Line.Click, AddressOf MiaLabel_Click
labelList.Add(Line)
Me.Controls.Add(Line)
Next
End Sub
Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs)
Dim currentLabel As Label = labelList(1) 'DirectCast(sender, Label)
Dim Line As Label
'For Each Line As Label In labelList
Line = currentLabel
Line.BackColor = Color.Red
End Sub
End Class
Non capisco il significato di "Dim currentLabel As Label = labelList
(1)" (ad ogni click peschi la seconda label nell'array, qualunque sia
il sender); ma se va bene a te...
> Non capisco il significato di "Dim currentLabel As Label = labelList
> (1)" (ad ogni click peschi la seconda label nell'array, qualunque sia
> il sender); ma se va bene a te...
nemmeno io...
se non facevo cosi non mi permetteva di metterci il valore 1 o 2 o 100
in labelList(xxx) e non riuscivo a usare la line che volevo...
ma i controlli activex sono spariti ... vero?
?!?
> ma i controlli activex sono spariti ... vero?
Non sono più "activex" ma ci sono sempre
prima non riuscivo a usare la labelList() che volevo io,
il tuo programma al click su una qualsiasi linea le
colorava tutte...cmq sei stato ... fondamentale!
Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs)
Dim Line As Label
Line = labelList(1)
Line.BackColor = Color.Red
end sub
quando clicco una qualsiasi linea mi si colora la seconda (quella che
voglio).
Private Sub MiaLabel_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs)
Dim Line As Label
Line = DirectCast(sender, Label)
Line.BackColor = Color.Red
End Sub
cosi invece mi si colora quella che clicco.