none
[VB.NET] Utilizzo di variabili per definire il nome di un oggetto

    Question

  • Salve a tutti,

    ho la necessita di richiamare nel codice una serie di oggetti con nomi di questo tipo (label1, label2,...) in modo da assegnare dei valori. Faccio un esempio:

            Label9.Text = Label1.Location.ToString
            Label10.Text = Label2.Location.ToString
            Label11.Text = Label3.Location.ToString
            Label12.Text = Label4.Location.ToString
            Label13.Text = Label5.Location.ToString
            Label14.Text = Label6.Location.ToString
            Label15.Text = Label7.Location.ToString
            Label16.Text = Label8.Location.ToString

    vorrei evitare di scrivere n volte una operazione che si potrebbe realizzare con un ciclo.

    Come posso fare ad inserire una variabile nel nome dell'oggetto?

    spero di essere stato chiaro

    Grazie per ogni aiuto


    Ruggiero Lovreglio
    www.ruggiero-lovreglio.tk

    Friday, May 11, 2012 7:36 PM

Answers

  • Ciao Ruggiero,

    Ciao Carmelo,

    non sono pratico di Linq, devo usarlo per forza in questo caso?

    Mi spiegheresti, se è possibile, come faccio per esempio a selezionare una gruppo di label che vada da un numero iniziale ad uno finale?

    Grazie per gli aiuti


    non sei assolutamente obbligato ad usare linq , puoi eseguire il tutto anche con dei cicli For e For Each , con il primo ciclo For recuperi la proprietà TabIndex del controllo label iniziale e la proprietà TabIndex del controllo label finale , quindi avrai per esempio

    For i = Label1.TabIndex To Label3.TabIndex

    esegui il ciclo For 3 volte ottenendo 0,1,2 perchè la proprietà TabIndex e in base zero.

    Esegui all'interno del ciclo for un ciclo For Each controllando ad ogni passaggio se il valore di TabIndex di myControl corrisponde al valore della variabile i del ciclo For.

    For Each myControl As Control In Controls.OfType(Of Label)()
                    If myControl.TabIndex.Equals(i) Then
                        myControl.Text = ""
                    End If
                Next

    Chiudendo poi il ciclo For con Next.

    Next

    Supponendo che tu abbia 10 label sul form ,questo esempio di codice calcellerà il contenuto della proprietà Text dei controlli Label1 , Label2, Labe3.
    Questo esempio e valido se le proprietà TabIndex del controlli label sono in ordine crescente , ma se nel mezzo trà Label1 e Label3 vi e per esempio un pulsante con la proprietà TabIndex 1 , la proprietà Text del controllo label2 non sarà modificata , ma neanche quella del pulsante perchè il metodo OfType(Of t) esegue un filtro in base al tipo specificato. 

    Ciao.


    Saturday, May 12, 2012 7:12 PM

All replies

  • Friday, May 11, 2012 10:57 PM
    Moderator
  • Ciao Renato,

    grazie per i link. Comunque credo di non aver capito dato che scrivendo questo semplice codice:

    Dim i As Short = 1
    Label(i).text = "ciao"

    il compilatore mi segnala un'errore per la label.

    Dove mi confondo?



    Ruggiero Lovreglio 
    www.ruggierolovreglio.altervista.org
    Saturday, May 12, 2012 12:09 PM
  • Ciao Ruggiero,

    Ciao Renato,

    grazie per i link. Comunque credo di non aver capito dato che scrivendo questo semplice codice:

    Dim i As Short = 1
    Label(i).text = "ciao"

    il compilatore mi segnala un'errore per la label.

    Dove mi confondo?


    Ruggiero Lovreglio
    www.ruggiero-lovreglio.tk

    l'errore segnalato e perchè stai cercando di utilizzare un oggetto in un espressione come segnalato dall'intellisense , se devi iterare solamente sulle label , oltre gli ottimi suggerimenti che hai avuto da Renato , vorrei consigliarti l'utilizzo di Linq mediante gli estension Method , vedi questi esempi di codice.

    Controls.Cast(Of Object).OfType(Of Label).ToList().ForEach(Sub(l) l.Text = "Test" & l.TabIndex)

    Questo esempio esegue un ciclo for each e valorizza la proprietà Text di ogni label presente sul form , dopo aver eseguito il cast degli oggetti , filtrato gli elementi mediante il metodo OfType e creato una Collection Of Label da passare poi all'istruzione For Each.

    Ciao.


    Saturday, May 12, 2012 12:47 PM
  • Ciao Carmelo La Monica,

    You wrote on 12/05/2012 :

    Controls.Cast(Of Object).OfType(Of Label).ToList().ForEach(Sub(l) l.Text =
    "Test" & l.TabIndex)

    il Cast(Of ) è inutile in questo caso, basta e avanza OfType(Of )

    .m



    blog @ //milestone.topics.it
    Saturday, May 12, 2012 1:01 PM
  • Ciao Mauro,

    il Cast(Of ) è inutile in questo caso, basta e avanza OfType(Of )

    si hai ragione , grazie della correzzione.

    Ciao.


    Saturday, May 12, 2012 1:05 PM
  • Ciao Carmelo,

    non sono pratico di Linq, devo usarlo per forza in questo caso?

    Mi spiegheresti, se è possibile, come faccio per esempio a selezionare una gruppo di label che vada da un numero iniziale ad uno finale?

    Grazie per gli aiuti


    Ruggiero Lovreglio 
    www.ruggierolovreglio.altervista.org



    Saturday, May 12, 2012 1:55 PM
  • Ciao Ruggiero,

    Ciao Carmelo,

    non sono pratico di Linq, devo usarlo per forza in questo caso?

    Mi spiegheresti, se è possibile, come faccio per esempio a selezionare una gruppo di label che vada da un numero iniziale ad uno finale?

    Grazie per gli aiuti


    non sei assolutamente obbligato ad usare linq , puoi eseguire il tutto anche con dei cicli For e For Each , con il primo ciclo For recuperi la proprietà TabIndex del controllo label iniziale e la proprietà TabIndex del controllo label finale , quindi avrai per esempio

    For i = Label1.TabIndex To Label3.TabIndex

    esegui il ciclo For 3 volte ottenendo 0,1,2 perchè la proprietà TabIndex e in base zero.

    Esegui all'interno del ciclo for un ciclo For Each controllando ad ogni passaggio se il valore di TabIndex di myControl corrisponde al valore della variabile i del ciclo For.

    For Each myControl As Control In Controls.OfType(Of Label)()
                    If myControl.TabIndex.Equals(i) Then
                        myControl.Text = ""
                    End If
                Next

    Chiudendo poi il ciclo For con Next.

    Next

    Supponendo che tu abbia 10 label sul form ,questo esempio di codice calcellerà il contenuto della proprietà Text dei controlli Label1 , Label2, Labe3.
    Questo esempio e valido se le proprietà TabIndex del controlli label sono in ordine crescente , ma se nel mezzo trà Label1 e Label3 vi e per esempio un pulsante con la proprietà TabIndex 1 , la proprietà Text del controllo label2 non sarà modificata , ma neanche quella del pulsante perchè il metodo OfType(Of t) esegue un filtro in base al tipo specificato. 

    Ciao.


    Saturday, May 12, 2012 7:12 PM
  • Grazie mille Carmelo,

    alla fine ci sono arrivato da solo ma ho visto che sono arrivato comunque alla soluzione suggerita da te.

    Riporto giusto un esempio:

            For i = 1 To 9
                For Each C As Control In Me.Controls.OfType(Of Label)()
                    If C.Name = "Label" & i Then
                        C.Location = New Point(i * 100, 100)
                    End If
                Next
            Next

    tuttavia sono fortemente interessato a imparare le basi di Linq. Mi potresti suggerire qualche manuale pratico da cui imparare la sintassi di base?


    Ruggiero Lovreglio 
    www.ruggierolovreglio.altervista.org


    Saturday, May 12, 2012 9:43 PM
  • Ciao Ruggiero,

    Grazie mille Carmelo,

    alla fine ci sono arrivato da solo ma ho visto che sono arrivato comunque alla soluzione suggerita da te.

    Riporto giusto un esempio:

            For i = 1 To 9
                For Each C As Control In Me.Controls.OfType(Of Label)()
                    If C.Name = "Label" & i Then
                        C.Location = New Point(i * 100, 100)
                    End If
                Next
            Next

    Prego , il fatto e che con linq puoi scrivere delle query che eseguono iterazioni sui controlli in modo molto più compatto di quello che ho suggerito e la tua soluzione , comunque sempre valida :)

    tuttavia sono fortemente interessato a imparare le basi di Linq. Mi potresti suggerire qualche manuale pratico da cui imparare la sintassi di base?

    Io ho scelto tempo fa questo libroditesto e periodicamente e anche tempo permettendo eseguo un ripasso , comunque parla di linq dalle basi fino ai concetti di linq avanzato e il codice di esempio e in C# che seguo di più. 

    Inoltre ti consiglio anche questo libro scritto da Alessandro Del Sole http://www.hoepli.it/libro/microsoft-linq/9788882337605.asp con esempi di codice in VisualBasic.

    Ciao.


    Saturday, May 12, 2012 10:04 PM