Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    36

    callbyname su controlli textbox

    Salve
    ho 50 controlli su un form chiamati tutti

    txt1
    txt2
    txt3
    txt4
    ...
    txt50

    vorrei che tramite un ciclo il backcolor di questi controlli cambiasse.

    ho provato a fare qualcosa del genere ma va in crash
    codice:
    for i = 1 to 50
            CallByName("txt" & i, "BackColor", CallType.Set, System.Drawing.Color.Chartreuse)
    next
    mi ricordo che in vb6 si poteva fare questa cosa, in .net?

    grazie,

  2. #2

    Moderazione

    Ti ricordo che:
    • le discussioni relative a VB.NET non sono trattate qui, ma nell'apposita sottosezione;
    • il codice va specificato tra tag [CODE] ... [/CODE], altrimenti perde l'indentazione;
    • il linguaggio di riferimento (e relativa versione) va sempre specificato (anche nel titolo, sotto forma di "tag").


    Ora correggo io e provvedo a spostare il thread, in futuro imposta correttamente la discussione fin da subito; nel frattempo ti consiglio di dare un'occhiata al regolamento.
    Amaro C++, il gusto pieno dell'undefined behavior.

  3. #3
    Quanto al problema, puoi usare la reflection o recuperare i controlli per nome dalla collection Controls del form corrente, ma faresti prima semplicemente ad inserire i controlli in questione in un array invece di usarne il nome. Se cerchi nel forum l'argomento è stato affrontato in passato.
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    Ciao,
    Non programmo in VB.NET da una vita ma il codice dovrebbe essere qualcosa del genere:

    codice:
    foreach Control in Form.Controls
    if Control.Name == "nome_controllo" then
    Control.BackColor = Color.Colore
    end if
    Next

  5. #5
    No per carità, non l'antipattern for-if
    Form.Controls è una Control.ControlCollection, la cui proprietà Item ha un overload per recuperare il controllo con il nome richiesto; per cui:
    codice:
    Form.Controls.Item("nome_controllo").BackColor = Color.Colore
    Amaro C++, il gusto pieno dell'undefined behavior.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2006
    Messaggi
    455
    Originariamente inviato da MItaly
    No per carità, non l'antipattern for-if
    Form.Controls è una Control.ControlCollection, la cui proprietà Item ha un overload per recuperare il controllo con il nome richiesto; per cui:
    codice:
    Form.Controls.Item("nome_controllo").BackColor = Color.Colore
    Allora in caso dovresti eseguire una funzione for-loop
    come agiresti per controllare se un dato equivale ad un altro dato?
    sono curioso perchè nei cicli for uso spesso le condizioni IF oppure uno switch.

  7. #7
    Ovviamente il for-if è indispensabile se devi effettivamente fare una ricerca lineare in un array; il punto è che spesso viene usato anche quando si ha a disposizione una struttura dati che fornisce metodi di ricerca più efficienti (vedi l'esempio dell'hashtable, che più o meno corrisponde al caso di cui stiamo discutendo) oppure la funzione fornisce metodi di filtraggio "a monte" che consentono di ottenere un array già scremato (caso della GetFiles).
    Amaro C++, il gusto pieno dell'undefined behavior.

  8. #8
    Originariamente inviato da MItaly
    ...
    Form.Controls è una Control.ControlCollection, la cui proprietà Item ha un overload per recuperare il controllo con il nome richiesto; per cui:
    codice:
    Form.Controls.Item("nome_controllo").BackColor = Color.Colore
    non mi sembra però che funzioni nel caso in controllo sia contenuto in un contenitore
    diverso dalla form stessa , per es un panel.

    Nel caso si potrebbe usare il metodo Find della ControlCollection della form con il parametro searchAllChildren=true
    EDIT:
    ... o, nel caso in questione, sarebbe un anti-pattern pure questo
    (visto che alla fine anche la Find dovrà come minimo interrogare le collection dei
    controlli contenitori nella form ed eventuali dei contenitori stessi)
    e tanto varrebbe usare una funzione di ricerca ricorsiva con un foreach

  9. #9
    Il punto è che se serve frequentemente a dei controlli tramite un indice numerico la cosa più sensata è prepararsi un array che faccia riferimento ai controlli in questione, in modo tale da poter accedere al controllo che interessa in tempo O(1).
    Amaro C++, il gusto pieno dell'undefined behavior.

  10. #10
    Originariamente inviato da MItaly
    Il punto è che se serve frequentemente a dei controlli tramite un indice numerico la cosa più sensata è prepararsi un array che faccia riferimento ai controlli in questione, in modo tale da poter accedere al controllo che interessa in tempo O(1).
    Certamente,
    ma almeno una volta bisognerà cercarli per memorizzarne il riferimento
    a meno che non si creino a runtime ... nel qual caso potrebbe diventare
    una bella scocciatura modificarne le proprietà da codice in un secondo momento.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.