VB2005 & array di label

lunedì 14 gennaio 2008 - 14.23

Dav-ide Profilo | Junior Member

Ho la necessità di creare un array di label, in vb6 quando creavo l'oggetto bastava mettere lo stesso nome di un'altra label.
In vb2005 non so come fare, si possono creare array? Come faccio?

aiedail92 Profilo | Expert

Ciao

sì, gli array si possono creare:

dim array() as Tipo = new Tipo() {oggetto1, oggetto2, oggetto3, ...}

se hai bisogno di creare un array di Label quindi ti consiglio prima di dichiarare tutte le label di cui hai bisogno e poi di creare l'array.
Oppure hai bisogno di inserirne un numero variabile in runtime? In questo caso ti consiglio di utilizzare le classi del namespace System.Collections.Generic, più o meno in questo modo:

Dim arrayDiLabel As New System.Collections.Generic.List(Of Label)() arrayDiLabel.Add(label1) arrayDiLabel.Add(label2) arrayDiLabel.Add(label3) ...

Se invece ho capito male io e avevi bisogno di qualcos'altro chiedi
Luca

Dav-ide Profilo | Junior Member

A grandi linee ho capito. Pensavo che come nel vecchio VB6 facendo copia-incolla mi chiedeva se generare una matrice di controlli.
Il dubbio mi è venuto vedendo le proprietà dell'oggetto... nessun index o indice per array.
Ok, proverò a crearmelo via codice come mi hai suggerito tu, ma poi come faccio a intercettare gli eventi sul click ad esempio?

GattoNero Profilo | Newbie

devi al momento in cui crei l'oggetto assegnare un handler all'evento...


quindi crei una sub che faccia da handler (per i parametri controlla MSDN)

per esempio per il click

Private Sub GestoreUnicoDeiClick(ByVal sender As System.Object, ByVal e As System.EventArgs)

' in sender sai quale delle label e' stata "cliccata"
MsgBox("WOW ho cliccato la label : " +a = "wow" + (TryCast(sender, Label).Text))

End Sub

schematico ma funziona :)

aiedail92 Profilo | Expert

sì, non conoscendo il VB6 e non sapendo quindi se è uguale al vb.net ti scrivo come aggiungere un handler al tuo controllo per l'evento click:

AddHandler label.Click, AddressOf labels_click

dove labels_click è una sub avente i parametri richiesti dall'evento click.

ugualmente se dovessi aggiungere un handler per uno qualsiasi degli altri eventi; devi solo stare attento al tipo dei parametri.


Luca

GattoNero Profilo | Newbie

oddio mi ero dimenticato quella "piccola" parte del codice

Dav-ide Profilo | Junior Member

Oddio ho accettato il post troppo in fretta...
Sai che non riesco a capire come gestire gli array di label?
Devo copiare un'array di stringhe su delle label, quindi mi servirebbe una funzione tipo

FOR I = 0 TO 9 DO
me.label(i).text = pippo(I)
NEXT I

Non riesco a capire come concatenare il tutto.
Ho provato con dim array() as Tipo = new Tipo() {oggetto1, oggetto2, oggetto3, ...}, come mi hai consigliato tu, ma "as Tipo" come devo dichiararlo?
Grazie

aiedail92 Profilo | Expert

Ciao

allora, se hai bisogno di un array che non viene modificato nel corso del programma, fai in questo modo:

Dim arrayDiLabel() As Label = New Label() {} {label1, label2, label3, ...} Dim arrayDiString() As String = New String() {} {string1, string2, string3, ...} Sub Imposta() For i As Integer = 0 To 9 arrayDiLabel(i).Text = arrayDiString(i) Next End Sub

Se invece il numero di label e di string varia nel corso del programma, il mio consiglio è di utilizzare il namespace System.Collections(.Generic). Le classi in questo Namespace risultano utili perchè facilitano la rimozione e l'inserimento di oggetti e non hanno una grandezza fissa:

Dim arrayDiLabel As New System.Collections.Generic.List(Of Label)() Dim arrayDiString As New System.Collections.Generic.List(Of String)() Sub Imposta() For i As Integer = 0 To 9 Me.arrayDiLabel(i).Text = arrayDiString(i) Next End Sub

Se devi aggiungere, inserire o rimuovere dei valori utilizzi il metodo arrayDiLabel.Add, .Insert, .Remove o .RemoveAt

Luca

GattoNero Profilo | Newbie

Allora che io sappia non si puo' fare cosi'... purtroppo stai cercando di fare un cast fra una label e una stringa
cosa che ovviamente non e' permessa....

uhm... una soluzione che mi viene in mente (te la lascio con il beneficio del dubbio perche' adesso non posso testarla), magari qualcuno la amplifica/corregge e' una cosa simile

Dim array() as Tipo=new Tipo(){new Tipo(stringa1),new Tipo(stringa2),... ecc...}

il problema e' che il costruttore della classe tipo deve accettare il parametro che gli passi...

a quanto credo mi pare l'unico modo di gestire la cosa in una riga sola (ovviamente se con la label non funziona puoi eventualmente derivare una classe da essa che possiede il costruttore che ti serve del tipo
(scusa la sintassi magari non precisa ma uso + il c# che non Vb)

public class MyLabel inherits Label Public Sub New(Testo as String) MyBase.New() Me.Text = Testo End Sub end class

ovviamente poi puoi fare dove necessario un "downgrade" da MyLabel a Label

Dav-ide Profilo | Junior Member

Ciao aiedail92, ho provato a fare come mi dici, ma qualcosa mi sfugge ancora....
Nel mio form ho circa 100 label che vorrei indicizzare: Label1, Label2, Label3....Label100.

Tu mi hai consigliato di fare questo, ma nella dichiarazione dell'arrayDiLabel, come faccio a far puntare l'array alle label usate nel form?

Dim arrayDiLabel() As Label = New Label() {} {label1, label2, label3, ...} <-----label1 non mi dice nulla, dovrei mettere Me.label1?
Dim arrayDiString() As String = New String() {} {string1, string2, string3, ...}

Sub Imposta()
For i As Integer = 0 To 9
arrayDiLabel(i).Text = arrayDiString(i)
Next
End Sub

Grazie

aiedail92 Profilo | Expert

Quindi tu hai bisogno di usare l'array per riuscire a gestire meglio le tue label, giusto? Se è così puoi popolarlo nel costruttore:

Dim arrayDiLabel(0 To 99) As Label Public Sub New() ' Chiamata richiesta da Progettazione Windows Form. InitializeComponent() arrayDiLabel(0) = Me.Label1 arrayDiLabel(1) = Me.Label2 ... End Sub

Che può essere eseguito più velocemente con un ciclo For se il nome di tutte le tue label è nella forma Labelx

Public Sub New() ' Chiamata richiesta da Progettazione Windows Form. InitializeComponent() For i As Integer = 1 To 100 arrayDiLabel(i - 1) = Me.Controls.Find("Label" & i, True)(0) Next End Sub

Se invece il problema è un altro scusami se non ho capito e prova a spiegarti meglio

Luca

Dav-ide Profilo | Junior Member

Ecco, io dovrei fare esattamente l'opposto....Ma non credo sia la sintassi giusta....

For i As Integer = 1 To 100
Me.Controls.Find("Label" & i, True)(0)= arrayDiLabel(i - 1)
Next


Cos'è la funzione InitializeComponent() che hai messo?

Dav-ide Profilo | Junior Member

Alla fine smanetta e smanetta, ci sono riuscito.....

For i As Integer = 1 To 100
Me.Controls.Find("Label" & Trim(Str(i)), True)(0).Text = Trim(Str(i)
Next

Grazie a tutti!
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5