Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Postato originariamente da Carlo:
Ho provato il controllo dinamico, è veramente versatile.
Posto il sorgente, con le solite labels |
Postato originariamente da Ultimo:
Ottimo esempio Carlo
Mettilo in valutazione programmi come "Esempi"
|
L'esempio è di Thejuster, lo dovrebbe inserire lui...
Il programma nasconde un'insidia, e se non si sono letti tutti i post precedenti, difficilmente trovabile.
Alla riga:
VerificaConNome(panel3.Controls[((MioCheckBox)sender).ID].Name, (((MioCheckBox)sender).Checked));
Il nome della label viene trovato usando l'ID del checkbox e l'indice della label.
per fare in modo che gli indici corrispondano devono essere rispettate due condizioni:
1) il panel1 che conterrà le checkbox deve essere vuoto, perchè l'ID proviene da:
mio.ID = panel1.Controls.Count;
si potrebbe modificare questa riga in:
mio.ID = i - 1;
2)l'indice della label proviene dall'ordine in cui è stata inserita nel panel3. Una verifica in form1.designer.cs è d'obbligo
//
// panel3
//
this.panel3.Controls.Add(this.label4); //indice = 0
this.panel3.Controls.Add(this.label5); //indice = 1
this.panel3.Controls.Add(this.label6); //indice = 2
this.panel3.Controls.Add(this.label7); //indice = 3
this.panel3.Location = new System.Drawing.Point(38, 219);
this.panel3.Name = "panel3";
this.panel3.Size = new System.Drawing.Size(218, 43);
this.panel3.TabIndex = 13; Ultima modifica effettuata da Carlo il 29/05/2018 alle 12:49
in programmazione tutto è permesso |
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Postato originariamente da Thejuster:
Mi fa piacere che ti piacciono gli operatori ternari
Puoi anche concatenare più funzioni e fare una catena.
Come in questo esempio che feci tanto tempo fà.
In una sola condizione, tramite una catena di operatori ternari feci una calcolatrice.
http://www.pierotofy.it/pages/guide_tutorials/CSharp/Calco ... |
Si mi piacciono, sono un estimatore dei codici minimali, a volte mi ci diletto, anche a discapito della comprensione del programma.
in programmazione tutto è permesso |
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Postato originariamente da Carlo:
Postato originariamente da Carlo:
Ho provato il controllo dinamico, è veramente versatile.
Posto il sorgente, con le solite labels |
Postato originariamente da Ultimo:
Ottimo esempio Carlo
Mettilo in valutazione programmi come "Esempi"
|
L'esempio è di Thejuster, lo dovrebbe inserire lui... |
Giusto
If ok Then GOTO Avanza else GOTO Inizia
|
|
Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
In questo caso può aiutare l'estensione per VS "CodeMaid"
tra le tante cose ha l'opzione per riordinare in modo alfabetico porzioni di codice.
In questo modo si evita di farlo a mano
Ultima modifica effettuata da Mikelius il 29/05/2018 alle 15:06 |
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Postato originariamente da Mikelius:
In questo caso può aiutare l'estensione per VS "CodeMain"
tra le tante cose ha l'opzione per riordinare in modo alfabetico porzioni di codice.
In questo modo si evita di farlo a mano |
Dove lo trovo?, è installato di default? Ultima modifica effettuata da Carlo il 29/05/2018 alle 14:43
in programmazione tutto è permesso |
|
Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
Postato originariamente da Carlo:
Dove lo trovo?, è installato di default? |
|
|
Thejuster (Admin)
Guru^2
Messaggi: 2306
Iscritto: 04/05/2008
|
Cmq, non serve fare tutto questo.
Vi apro la mente perché vedo che avete preso seriamente la cosa di studiare il C#.
quindi questa soluzione può tornarvi molto utile in futuro.
Punto:
Abbiamo diversi controlli inseriti nel panel ma con indici che non sono ordinati correttamente.
Soluzione
Si crea un Enumeratore che vada ad enumerare tutti i controlli di un determinato oggetto.
Codice sorgente - presumibilmente Plain Text |
IEnumerable<Control> t = panel1.Controls.Cast<Control>();
|
Enumerato tutti i controlli, a noi interessa solo le CheckBox.
Quindi effettuiamo una selezione
Ma, siccome l'oggetto CheckBox non è un contenitore e non ha un indice di riferimento.
E meglio ordinare manualmente aggiungendo esempio al nome 1,2,3
O rimanere di default: CheckBox1,CheckBox2 etc.
Selezioniamo dall'enumeratore tutti i checkbox
poi li ordiniamo tramite il LinQ
Codice sorgente - presumibilmente Plain Text |
CheckBox[] cc = t.OfType<CheckBox>().ToArray<CheckBox>();
c = c.OrderBy(x => x.Name).ToArray();
|
Successivamente avendo un array, possiamo accedere agli elementi con gli indici.
O Meglio ancora, effettuare una selezione diretta senza eseguire nessuna funzione di recupero.
Codice sorgente - presumibilmente Plain Text |
CheckBox trovato = c.Where(x => x.Name.Contains("1")).FirstOrDefault();
|
Che sarebbe:
Recuperami dall'array, il checkbox che nella proprietà del nome, ha come numero di ordinazione 1
Fatto questo, vi risparmiate la noia di andare a fare Cicli for, su cicli.
Switch, e quant'altro.
Codice Completo
Codice sorgente - presumibilmente C++ |
public CheckBox TrovaElemento(string numero_di_riferimento) { try { IEnumerable<Control> t = panel1.Controls.Cast<Control>(); CheckBox[] c = t.OfType<CheckBox>().ToArray<CheckBox>(); c = c.OrderBy(x => x.Name).ToArray(); CheckBox trovato = c.Where(x => x.Name.Contains(numero_di_riferimento)).FirstOrDefault(); return trovato; } catch(Exception a) { throw new NullReferenceException(a.Message); } }
|
Ultima modifica effettuata da Thejuster il 30/05/2018 alle 18:14
|
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Postato originariamente da Thejuster:
Che sarebbe:
Recuperami dall'array, il checkbox che nella proprietà del nome, ha come numero di ordinazione 1
Fatto questo, vi risparmiate la noia di andare a fare Cicli for, su cicli.
Switch, e quant'altro. |
E' qui che mi serviva arrivare, nei casi in cui mi serve accedere ad un controllo direttamente, attraverso un indice numerico, che ho calcolato ad hoc, non voglio ciclare tutti i controlli.
Proverò al più presto il codice su un mio programma per capire in pratica e verificare. Ultima modifica effettuata da Carlo il 30/05/2018 alle 18:59
in programmazione tutto è permesso |
|