none
È possibile impostare le proprietà di un oggetto sapendo il suo "name"? RRS feed

  • Domanda

  • Salve, vorrei sapere se è possibile impostare le proprietà di un elemento sapendo il suo name. Per fare un esempio, in JS "document.getElementById("ID_ELEMENTO").eccetera". Vorrei sapere se esiste un comando simile anche su C# (VisualStudio).

    Ho visto anche su Internet, ma non sono riuscito a trovare nulla. Chiedo scusa se è già stata posta una domanda del genere.

    Grazie.

    giovedì 1 agosto 2019 14:07

Risposte

Tutte le risposte

  • Se l'oggetto di cui vuoi conoscere le property è un componente posto su una Form Windows o una Window WPF e tu ti trovi sulla classe del suo "code behind" qualsiasi proprietà dell'oggetto è accessibile con

    nomeOggetto.NomeProprietà

    In WIndows Forms tutti gli oggetti hanno un nome quindi basta guardare le loro proprietà sul designer e sai come si chiamano. (Ma intellisense ti aiuta anche con quello).

    In WPF invece gli oggetti non hanno tutti un nome, per fare quello che vuoi, puoi usare l'attributo Name che puoi assegnare all'oggetto che ti interessa per leggere le sue property.

    Però, se stai lavorando in WPF piuttosto che leggere le property di un oggetto visuale, si collegano in Binding sulle property che definisci tu nel ViewModel e non ti serve richiederle perché vengono automaticamente aggiornate in entrambi i sensi.

    Se indichi che tipo di oggetto usi, qual'è la tecnologia e cosa vorresti fare, posso provare a farti un esempio di codice.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    sabato 3 agosto 2019 19:52
  • No, esattamente io non ho il nome preciso del componenti. O meglio, mi spiego. Ho alcuni Button, chiamiamoli "button1", "button2" e "button3".

    Ponendo il caso che io voglia cambiare il colore dello sfondo per questi tre button, dovrei fare:

    button1.Backcolor..
    button2....
    button3.....

    Che non è molto funzionale, quando si potrebbe creare una funzione (o un semplice for) del tipo:

    for (int i=1;i<=3;i++)

    { button+[i].backcolor ....}

    Vorrei sapere se è possibile fare una cosa del genere. Grazie

    domenica 4 agosto 2019 00:06
  • Questo mi consola. Non siamo solo noi anziani a rimpiangere le famose "matrici di controlli" dell'epoca VB.

    Esistono diversi sistemi per fare quello che vorresti, dipende anche da questo "backcolor", se è uguale per tutti i button o se vuoi assegnare dei colori presi da un vettore di colori button i backcolor = colori[i].

    Puoi creare un elenco di button e poi fai un for each, puoi creare un vettore…

    … talvolta noi anziani, più per una abitudine non so quanto cattiva legata alla nostalgia, usiamo la proprietà tag dei controlli e poi facciamo un for each …. in panelxxxx (se li separi in pannelli) ed una conversione ad int dei caratteri del tag (1 , 2 ….) così abbiamo l'illusione di avere le nostre antiche matrici così come erano all'epoca, con i controlli disposti a schermo WYSIWYG ed il loro indice associato.

    Sabrina, che è più giovane ad anche molto brava, ti indicherà sicuramente una via più moderna e più aderente alla filosofia del .NET. Forse - nonostante l'inerzia mentale - anche io trarrò giovamento dalle indicazioni moderne.

    domenica 4 agosto 2019 06:57
  • Stai lavorando in WInforms o in WPF?

    Perché funziona in modo diverso ma è più semplice di quanto tu creda in entrambi i sistemi.

    se mi dici quale ti faccio un esempio.

    In ogni caso esistono ovviamente le collection dei controlli che puoi ciclare.

    Ma pure essendo anche io un dinosauro della programmazione non ho alcuna nostalgia delle matrici ;)

    visto che c'è di molto meglio.

    Provate a raccontare cosa volete fare mi rendete molto più semplice farvi un esempio per darvi una mano a capire il come fare invece di focalizzarvi su come lo facevate prima in altri sistemi.

    saluti


    Sabrina C. - http://www.dotnetwork.it

    lunedì 5 agosto 2019 13:48
  • Sì sì, certo.

    Per rispondere alle tue domande: con WinForms e ciò che voglio fare è, banalizzando:

    creare un numero TOT (variabile) di Button e l'evento Click su ciascuno di essi deve compiere azioni diverse, (esempio) stampare

    MessageBox.Show("ButtonName: " + button_name.Name

    Ora, la soluzione che ho adottato è stata quella di creare una List di tipo Button con tutti i nomi dei button che man mano vengono aggiunti e in un altra lista salvare il loro nome.

    List<Button> lista_elementi = new List<Button>();
    List<string> lista_nomi = new List<string>();

    In questo modo riesco a ottenere sia il nome e sia l'elemento facendo un ciclo. Tipo:

    for(int i = 0; i < lista_elementi.Count; i++)
    {
    lista_elementi[i].... //elemento
    }

    Volevo capire se c'è un metodo più nativo ed efficiente di quello da me adottato.

    Grazie per l'aiuto.

    lunedì 5 agosto 2019 22:34

  • Ma pure essendo anche io un dinosauro della programmazione non ho alcuna nostalgia delle matrici ;)

    visto che c'è di molto meglio.


    Sabrina C. - http://www.dotnetwork.it

    Lo so che c'è di molto meglio, infatti l'unica cosa che alcuni di noi paleoprogrammatori rimpiangiamo è la famosa matrice dei controlli, quella che creavi nella finestra di progettazione del form. Si possono raccogliere i controlli in collection, ma che io sappia lo si può fare dal codice e talvolta lo faccio (se voglio disabilitare alcuni pannelli in determinate circostanze e così via).

    Tu come sostituisci l'antica matrice di controlli?

    martedì 6 agosto 2019 14:52
  • Ma veramente se parliamo di Winforms la matrice è sempre li, si chiama

    this.Controls

    ;)

    è chiaro che per percorrerla se ci sono dei contenitori devi usare la ricorsione.

    Posso fare un esempio in merito, non è difficile.


    Sabrina C. - http://www.dotnetwork.it

    mercoledì 7 agosto 2019 10:39
  • Quanto dici è fattibile senza problemi, ti preparo un esempio se riesco a ritagliarmi qualche ora in serata.

    la collection dei controls della form ti può aiutare a ciclare i button. e per assegnare ad ogni button una azione da compiere ovviamente devi creare degli Event handler specifici.

    private void Form1_Load(object sender, EventArgs e)
    {
    	StringBuilder sb = new StringBuilder();
    	sb.AppendLine("Bottoni trovati");
    	foreach (Control c in this.Controls)
    	{
    		Button b = c as Button;
    		if (b != null)
    		{
    			if (b.Name == "button1")
    			{
    				b.Click += Print_Click;
    			}
    			if (b.Name == "button2")
    			{
    				b.Click += New_Click;
    			}
    			if (b.Name == "button3")
    			{
    				b.Click += Delete_Click;
    			}
    			sb.AppendLine(b.Text);
    		}
    	}
    
    	MessageBox.Show(sb.ToString());
    }
    
    private void Print_Click(object sender, EventArgs e)
    {
    	MessageBox.Show("This is the Print Button");
    }
    
    private void New_Click(object sender, EventArgs e)
    {
    	MessageBox.Show("This is the New Button");
    }
    
    private void Delete_Click(object sender, EventArgs e)
    {
    	MessageBox.Show("This is the Delete Button");
    }
    Un semplice esempio con 3 button sulla form lo trovi qui sopra.

    Potrebbe essere più semplice creare i bottoni da codice ed agganciare l'event handler che devono usare per compiere l'azione specifica.

    appena ho un esempio un po' più utile in merito pronto ti posto un link



    Sabrina C. - http://www.dotnetwork.it

    mercoledì 7 agosto 2019 10:51
  • Come promesso, ho creato un esempio ed un articolo che lo spiega.

    si trova a questo indirizzo:

    http://www.sabrinacosolo.com/windows-forms-alcune-funzionalita-per-gestire-i-controlli/

    buona serata


    Sabrina C. - http://www.dotnetwork.it

    • Contrassegnato come risposta Sav22999 giovedì 8 agosto 2019 11:14
    mercoledì 7 agosto 2019 21:17
  • Eccellente. Grazie mille :)
    giovedì 8 agosto 2019 11:14
  • Vedo che tutto sommato il sistema che di solito adopero non è tanto diverso dal tuo. Alla fine nonostante il dinosaurismo sfrutto correttamente (spero) i vari controlli.

    Personalmente, invece che tramite il nome, preferisco agire tramite la proprietà tag dei controlli e poi vado di for each (su VB che preferisco a C# ma è lo stesso in questo ambito) anche ricorsivo o limitato ai panel che mi interessano.

    venerdì 9 agosto 2019 14:50
  • Io ho lasciato Windows Forms per WPF dal 2012 senza rimpianti, perché permette di fare molto di più con una filosofia che mi si confà, però Winforms è stata un ottimo supporto a tutti i miei progetti dal 2005 ed è una tecnologia robusta e ben fatta per le applicazioni desktop.


    Sabrina C. - http://www.dotnetwork.it

    venerdì 9 agosto 2019 15:27