Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Postato originariamente da Thejuster:
Crearti un componente personale non va bene?
|
Non ho ancora studiato bene la procedura |
|
Carlo (Member)
Guru
Messaggi: 1316
Iscritto: 29/01/2018
|
Postato originariamente da Mikelius:
Salve, ho una domanda:
ho 4 checkBox (ma potrebbero diventare anche 20)
che se vidimate (chekkate non mi piace) ognuna svolge un compito. Non sono mutuamente eclusive.
Ho risolto in questo modo (nel TAG ho inserito numeri progressivi per ogni checkBox):
Codice sorgente - presumibilmente C# |
foreach (Control item in groupBoxOutput.Controls) { if(item is CheckBox fileCheck ) { if (fileCheck.Enabled) { switch (fileCheck.Tag) { case 1: a(); continue; case 2: b(); continue; //////// } } } }
|
e buono? ci sono metodi più eleganti? |
Mi sono scontrato anche io con questo problema, e ho risolto come te mettendo un numero nel Tag per identificare il controllo processato.
Ci dovrebbe essere una procedura che ancora non mi è chiara, usando il nome del controllo.
Altra soluzione, in VS da codice si può creare una matrice di controlli, con l'indice accedi solo al controllo che vuoi senza usare foreach.
E' il metodo che uso più di frequente, per me il più elegante, e comprensibile, ma se Microsoft ha tolto la possibilità di inserire una matrice di controlli direttamente da progettazione, avrà reputato che c'è una soluzione migliore!
La risposta di Thejuster è sicuramente la più corretta, ma con le mie conoscenze, non sono in grado di metterla in pratica, ci vorrebbe un esempio.
Ultima modifica effettuata da Carlo il 26/05/2018 alle 22:52
in programmazione tutto è permesso |
|
Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Per quanto riguarda il nome del controllo.
Si potrebbe impostare il nome nello swicth
Codice sorgente - presumibilmente C# / VB.NET |
switch (fileCheck.Name)
{
case "label1":
a();
continue;
case "label2":
b();
continue;
////////
}
|
in c# accetta pure stringhe
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Postato originariamente da Thejuster:
Crearti un componente personale non va bene?
Crei un controllo basato sulle CheckBox.
E aggiungi altri campi pubblici come riferimento
Così oltre ad avere il campo TAG puoi inserire più elementi a riferimento nel controllo
ed avere una migliore gestione. |
Esatto, col mio codice basta aggiungere altri parametri alla funzione
per discriminare le varie attività da svolgere.
If ok Then GOTO Avanza else GOTO Inizia
|
|
Carlo (Member)
Guru
Messaggi: 1316
Iscritto: 29/01/2018
|
Postato originariamente da Mikelius:
Per quanto riguarda il nome del controllo.
Si potrebbe impostare il nome nello swicth
Codice sorgente - presumibilmente C# / VB.NET |
switch (fileCheck.Name)
{
case "label1":
a();
continue;
case "label2":
b();
continue;
////////
}
|
in c# accetta pure stringhe |
Esatto e nel tuo caso che le routine sono tutte distinte va bene così, e il tag è libero per altri usi.
Invece se uno ha bisogno di un indice numerico si potrebbe costruire il nome del controllo cercato modificando l'ultimo carattere rappresentato da un numero. Ultima modifica effettuata da Carlo il 27/05/2018 alle 13:34
in programmazione tutto è permesso |
|
Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Postato originariamente da Ultimo:
Postato originariamente da Thejuster:
Crearti un componente personale non va bene?
Crei un controllo basato sulle CheckBox.
E aggiungi altri campi pubblici come riferimento
Così oltre ad avere il campo TAG puoi inserire più elementi a riferimento nel controllo
ed avere una migliore gestione. |
Esatto, col mio codice basta aggiungere altri parametri alla funzione
per discriminare le varie attività da svolgere. |
Allora, per il momento resto usando il campo TAG e nel frattempo studio la creazione di controlli specializzati |
|
Carlo (Member)
Guru
Messaggi: 1316
Iscritto: 29/01/2018
|
Postato originariamente da Mikelius:
Salve, ho una domanda:
ho 4 checkBox (ma potrebbero diventare anche 20)
che se vidimate (chekkate non mi piace) ognuna svolge un compito. Non sono mutuamente eclusive.
Ho risolto in questo modo (nel TAG ho inserito numeri progressivi per ogni checkBox):
Codice sorgente - presumibilmente C# |
foreach (Control item in groupBoxOutput.Controls) { if(item is CheckBox fileCheck ) { if (fileCheck.Enabled) { switch (fileCheck.Tag) { case 1: a(); continue; case 2: b(); continue; //////// } } } }
|
e buono? ci sono metodi più eleganti? |
Mi sono documentato un po' i controlli si possono richiamare con l'indice, e con il nome, accorciando di molto il codice, non sono riuscito ad accedere alla proprietà .Checked attraverso l'indice, devo studiare ancora.
Per la mia personale conoscenza, quanto appreso apre un nuovo scenario di possibilità.
Credevo che Microsoft avesse deprecato l'uso delle matrici di controlli, sbagliavo, l'ha potenziata, tanto che ora tutti i controlli fanno sempre parte di una matrice.
Mi ero fatto influenzare dall'istruzione foreach, che credevo fosse il sistema principe per accedere ai controlli, ed è così se si devono per esempio abilitarli o disablitarli tutti. Ultima modifica effettuata da Carlo il 29/05/2018 alle 4:32
in programmazione tutto è permesso |
|
Carlo (Member)
Guru
Messaggi: 1316
Iscritto: 29/01/2018
|
Mi sono chiesto senza trovare risposta, come si determina in quale ordine vengono processati i controlli, ed eventualmente come scegliere l'ordine voluto.
Dal momento che ora ho capito come accedere ad un singolo controllo anche tramite indice, sapere come assegnare l'indice é prioritario.
Quando si aggiungono i controlli sul form o in un contenitore, gli indici che vengono automaticamente assegnati, potrebbero non avere la progressione voluta, non ho trovato info su come cambiare questa progressione.
La risposta sta nel file: Form1.designer.cs, autogenerato
es: 4 checkBox nel panel1
Codice sorgente - presumibilmente C# / VB.NET |
//
// panel1
//
this.panel1.Controls.Add(this.checkBox1);
this.panel1.Controls.Add(this.checkBox2);
this.panel1.Controls.Add(this.checkBox3);
this.panel1.Controls.Add(this.checkBox4);
this.panel1.Location = new System.Drawing.Point(39, 25);
this.panel1.Name = "panel1";
this.panel1.Size = new System.Drawing.Size(214, 129);
this.panel1.TabIndex = 12;
|
riordinare i controlli nell'ordine voluto
il primo controllo aggiunto avrà indice = 0
Il secondo 1, il terzo 2, ecc ecc
Ultima modifica effettuata da Carlo il 28/05/2018 alle 1:20
in programmazione tutto è permesso |
|