Textbox generate

di il
11 risposte

Textbox generate

Salve a tutti,

Mi chiedevo... generando delle textBox con un ciclo for:
{
                    //numcontrolli = Convert.ToInt32(textBox1.Text);
                    label1 = new Label();
                    label1.Text = "Coefficente B" + i.ToString();
                    label1.Top = 150 + i * 50;
                    label1.Left = 96;
                    Controls.Add(label1);

                    textBox1 = new TextBox();
                    //textBox1.Text = "" + i.ToString();
                    textBox1.Top = 150 + i * 50;
                    textBox1.Left = 200;
                    Controls.Add(textBox1);
                }
andando ad utilizzare le textbox appena generate, che nome viene assegnatole per lavorare sulle nuove?
la prima creata sul form da me è la textBox1, le altre generate con il ciclo for?

11 Risposte

  • Re: Textbox generate

    Ciao

    Penso ci sia un errore di concetto: Visual Studio fa alcune cose "al posto nostro".
    Nel caso specifico, quando crei una label e gli assegni il nome label1, Visual Studio sotto le quinte fa tutto questo:
    • Crea una variabile privata (o quello che metti nell'editor) di nome label1
    • Nel costruttore della form istanzia una nuova Label e gli assegna tutte le proprietà grafiche
    • Aggiunge la label ai controlli grafici
    • Assegna il riferimento alla label così creata alla variabile label1
    In questo modo nel codice puoi usare la variabile label1 per gestire la label creata graficamente.


    Quello che stai facendo nel tuo ciclo, invece, è quello di creare nuove label ed aggiungerle all'interfaccia grafica (elenco dei Controls).
    Poi però vai a sovrascrivere la variabile label1 con il riferimento all'ultima label creata.

    Questo vuol dire che, dopo il tuo ciclo, quando il codice utilizza la variabile label1, sta in realtà usando l'ultima label che hai creato nel tuo ciclo e non più quella creata dall'editor di Visual Studio.



    Se ti serve un riferimento a tutte le label che crei dinamicamente puoi usare un array:
    
    
       // Da qualche parte nella classe Form
       int maxLabels = 100;
       Label[] labels = new Label[maxLabels];
    
    
       // Questo è concettualmente il metodo in cui aggiungi le labels
       private void MetodoCheAggiungeLeLabels()
       {
          for (int i = 0; i < maxLabels; i++)
          {
             var newLabel = new Label();
             newLabel.Text = "Coefficente B" + i.ToString();
             newLabel.Top = 150 + i * 50;
             newLabel.Left = 96;
             Controls.Add(newLabel);
             labels[i] = newLabel;
          }
       }   
       
       
       
       // Altro metodo che viene richiamato dopo aver aggiunto le labels dinamiche
       private void CambiaTerzaLabel()
       {
           var terzaLabel = labels(2): // Ricorda che l'indice ha base 0
           terzaLabel.Text = "Nuovo testo della terza label";
       }
    
  • Re: Textbox generate

    Oltre al valido suggerimento di PiGi, aggiungo che all'interno del ciclo si può valorizzare anche la proprietà Name del controllo (Label o TextBox che sia, tanto ereditano entrambi da Control che ha quella proprietà). Nel momento in cui ci sia la possibilità di "costruire" un Name significativo, si aggiunge al ciclo l'istruzione
    textbox1 = new TextBox();
    textbox1.Name = string.Format("txtCoeffB{0}",i);
    ...
    Controls.Add(textbox1);
    Sapendo quindi come si chiama, ed avendola già aggiunta alla collection [Controls], la si può manipolare ad esempio così:
    string txtName = string.Format("txtCoeffB{0}", index);
    TextBox txt = Controls[txtName] as TextBox;
    if(txt != null)
        txt.Text = "Nuovo testo";
    Le ultime versioni del C# (come la 9.0) permettono di risparmiare qualche carattere di codice, ma il concetto resta. Si pesca un oggetto di tipo Control dalla collection sfruttando il Name, lo si casta a Textbox e se non è [null] allora si manipola.
  • Re: Textbox generate

    Se io creo una nuova textbox, ed ad essa devo rigestirla nel codice, come ma chiama il visualstudio?
    Dato che non è stata generata da me e quindi non me la ritovo del designer?
  • Re: Textbox generate

    Scusa, ma non ho capito le domande...
  • Re: Textbox generate

    Facendo generare dal codice una textbox con il comando "new TextBox()", la genera il visualstudio...
    Ma non potendola gestire nel designer, come faccio a recuparere la prorpiretà NAME della textbox?
  • Re: Textbox generate

    Sterlok ha scritto:


    Facendo generare dal codice una textbox con il comando "new TextBox()", la genera il visualstudio...
    Ma non potendola gestire nel designer, come faccio a recuparere la prorpiretà NAME della textbox?
    Visual Studio è un IDE, non genera nulla, al massimo scrive il codice (o i dati) necessari a creare la TextBox se la trascini in fase di progettazione, facendo parte del lavoro al tuo posto, oppure ti aiuta a scrivere direttamente del codice con cui sei tu a creare a tuo piacimento una TextBox.

    Se trascini il controllo, VS ti aiuta assegnando un nome predefinito, che poi dovrai andare a cambiare in base all'utilizzo che fai di quel controllo, ma tale nome è presente solo perché, per default, viene creato anche un campo nella classe del Form con cui puoi riferirti a quel controllo (in breve, una variabile/identificatore che in fase di esecuzione contiene il riferimento al controllo e ti permette di pilotarlo).

    Se i controlli li crei tramite codice tuo, diciamo "a mano", allora è un altro processo in cui VS non è coinvolto e dovrai fare in modo di memorizzare i riferimenti ai controlli che crei in strutture di tua scelta, che potrebbero essere array, liste e dizionari; opzionalmente, puoi assegnare addirittura un nome al controllo, ma non sarebbe significativo perché non stai utilizzando l'automatismo descritto qui sopra, ma stai gestendo in modo autonomo ciò che fa VS.

    La tua richiesta non è assolutamente chiara o, comunque, non fa capire quale sia il problema, mentre in compenso rivela la mancanza di un approfondimento su alcuni concetti strettamente necessari: programmazione a oggetti, differenza tra le fasi di designtime e runtime, e probabilmente altre cose ancora.
  • Re: Textbox generate

    Sterlok ha scritto:


    Facendo generare dal codice una textbox con il comando "new TextBox()", la genera il visualstudio...
    No, la fai generare al runtime (come tutti i controlli, compresi quelli che trascini nel Designer. Guarda cosa fa InitializeComponent() selezionando l'istruzione da codice e premendo F12). Nel momento in cui lanci l'eseguibile, VS gestisce solo più la parte di debug... Leggi con attenzione la precedente riposta di Alka che ti da un sacco in informazioni utili.

    Sterlok ha scritto:


    Ma non potendola gestire nel designer, come faccio a recuparere la prorpiretà NAME della textbox?
    Non ti serve recuperarla, ma usarla per recuperare il riferimento all'oggetto. Se riguardi l'esempio che ti ho postato, nel ciclo costruisco una stringa e l'assegno alla proprietà Name (la riga prima dei puntini "..."). Poi, in un'altra parte del codice , uso la stessa logica per costruirla un'altra volta e, quanto generato lo uso per recuperare quanto mi serve (la riga TextBox txt = Controls[txtName] as TextBox;).

    Una volta che ho valorizzato la variabile [txt], posso usarla per modificare la TextBox come più mi aggrada. La riga [txt.Text = "Nuovo testo";] ne è un esempio, ma avrei potuto modificare il txt.Top o il txt.Left per spostare l'oggetto sulla form secondo le mie esigenze.
  • Re: Textbox generate

    Perché non cominci da cose più semplici dato che stai iniziando adesso?
  • Re: Textbox generate

    E' un corso di poche ore dobbiamo affrontare piu argomenti, pensa solo 44 ore, non possimao soffermarci su if e else sempre... adesso siamo su try e catch... sono sempre basilari
  • Re: Textbox generate

    Ok, il fatto è che in 44 ore c'è veramente poco tempo ... non puoi assimilare tutti i concetti, anche i più complessi, partendo da zero, in un corso intensivo.
  • Re: Textbox generate

    Sono daccordo con te... però per scrivere piccoli applicativi, andrebbe bene, sono ansioso di lavorare con le dll, come ti sembra?
Devi accedere o registrarti per scrivere nel forum
11 risposte