Mikelius (Member)
Expert
Messaggi: 525
Iscritto: 14/04/2017
|
forse mi sbaglio, ma non vengono numerati in ordine di creazione?
|
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Postato originariamente da Mikelius:
forse mi sbaglio, ma non vengono numerati in ordine di creazione? |
In un form vuoto si, ma se sposti, copi o elimini poi aggiungi ecc non sai più in che ordine sono.
Controlla nel designer l'ordine dei controlli, di un tuo form, avrai delle sorprese.
in programmazione tutto è permesso |
|
Thejuster (Admin)
Guru^2
Messaggi: 2305
Iscritto: 04/05/2008
|
Bisogna capire cosa si ha intenzione di fare.
Normalmente, un controllo, una volta depositato sul form, significa che deve rimanere li è non mosso.
Quindi il programmatore conosce il suo indice e va a manipolare quel controllo.
Nel caso ci siano uno o più controlli da gestire, o che magari vengono eliminati o creati a runtime,
in questo caso nasce l'esigenza di una lista basata su una struttura
Per il discorso di prima, quello di aggiungere ulteriori campi ad un controllo,
Basta creare una semplice classe ed ereditare la classe del controllo più aggiungerci
una variabile pubblica
Codice sorgente - presumibilmente VB.NET |
public class MioCheckBox : CheckBox { private int _id; private string _altroTag; public int ID { get { return _id; } set { _id = value; } } public string AltroTago { get { return _altroTag; } set { _altroTag = value; } } }
|
Gestione di un controllo dinamico
Codice sorgente - presumibilmente C# / VB.NET |
//Controllo MioCheckBox1
MioCheckBox mio = new MioCheckBox();
mio.Tag = "blabla";
mio.ID = panel.Controls.Count;
mio.AltroTag = "altro Tag";
mio.Click = new EventHandler(MioCheckClick);
panel.controls.add(mio);
//Come nell'esempio di carlo, quello di colorare i panel
void MioCheckClick(object sender, e EventArgs)
{
panel.controls[((MioCheckBox)sender).ID].backcolor = (((MioCheckBox)sender).Checked) ? Color.Yellow : Color.Transparent;
}
|
|
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Postato originariamente da Thejuster:
Normalmente, un controllo, una volta depositato sul form, significa che deve rimanere li è non mosso.
Quindi il programmatore conosce il suo indice e va a manipolare quel controllo.
|
Metto 10 TextBox, 2 Label, 2 CheckBox, poi decido che mi occorrono altre 3 TextBox, e l'ID delle nuove TextBox sarà sicuramente successivo a tutti i controlli già presenti sul contenitore perdendo la progressione indispensabile se si vuole gestire con l'indice e ciclo for.
Sapere che si può manipolare l'ID tramite il designer, è un'informazione da tenere bene in mente.
Il problema non sussiste se si usano i nomi dei controlli.
Postato originariamente da Thejuster:
panel.controls[((MioCheckBox)sender).ID].backcolor = (((MioCheckBox)sender).Checked) ? Color.Yellow : Color.Transparent;
|
Wow, non imaginavo nemmeno che un IF THEN ELSE si potesse scrivere così.
Hai postato preziose informazioni, il controllo dinamico lo provo subito, grazie.
in programmazione tutto è permesso |
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Applicando le nuove conescenze al mio ConvertitoreMisure in C#, ho eliminato 70 righe di codice, le 24 text che avevo nel Panel2 e dovevo scrivere, leggere e colorare selettivamente ora le gestisco con un unico ciclo for.
Confermo che per avere gli indici progressivi e contigui ho dovuto riordinarle nel designer.cs, erano tutte rovesciate e c'era una label in mezzo.
Ecco l'aspetto dopo il riordino manuale che mi ha fatto ottenere l'indice da 0 a 23:
Codice sorgente - presumibilmente Plain Text |
-
//
// Panel2
//
this.Panel2.BorderStyle = System.Windows.Forms.BorderStyle.FixedSingle;
this.Panel2.CausesValidation = false;
this.Panel2.Controls.Add(this.textBox00);
this.Panel2.Controls.Add(this.textBox01);
this.Panel2.Controls.Add(this.textBox02);
this.Panel2.Controls.Add(this.textBox03);
this.Panel2.Controls.Add(this.textBox04);
this.Panel2.Controls.Add(this.textBox05);
this.Panel2.Controls.Add(this.textBox06);
this.Panel2.Controls.Add(this.textBox07);
this.Panel2.Controls.Add(this.textBox000);
this.Panel2.Controls.Add(this.textBox001);
this.Panel2.Controls.Add(this.textBox002);
this.Panel2.Controls.Add(this.textBox003);
this.Panel2.Controls.Add(this.textBox004);
this.Panel2.Controls.Add(this.textBox005);
this.Panel2.Controls.Add(this.textBox006);
this.Panel2.Controls.Add(this.textBox007);
this.Panel2.Controls.Add(this.textBox0000);
this.Panel2.Controls.Add(this.textBox0001);
this.Panel2.Controls.Add(this.textBox0002);
this.Panel2.Controls.Add(this.textBox0003);
this.Panel2.Controls.Add(this.textBox0004);
this.Panel2.Controls.Add(this.textBox0005);
this.Panel2.Controls.Add(this.textBox0006);
this.Panel2.Controls.Add(this.textBox0007);
this.Panel2.Controls.Add(this.butNascondi);
this.Panel2.Controls.Add(this.butTrasferisci);
this.Panel2.Controls.Add(this.textUnita);
this.Panel2.Controls.Add(this.Label1);
this.Panel2.Location = new System.Drawing.Point(630, 6);
this.Panel2.Name = "Panel2";
this.Panel2.Size = new System.Drawing.Size(349, 334);
this.Panel2.TabIndex = 172;
|
Ultima modifica effettuata da Carlo il 28/05/2018 alle 18:36
in programmazione tutto è permesso |
|
Carlo (Member)
Guru
Messaggi: 1344
Iscritto: 29/01/2018
|
Postato originariamente da Thejuster:
Per il discorso di prima, quello di aggiungere ulteriori campi ad un controllo,
Basta creare una semplice classe ed ereditare la classe del controllo più aggiungerci
una variabile pubblica
Codice sorgente - presumibilmente VB.NET |
class Class1 { public class MioCheckBox : CheckBox { private int _id; private string _altroTag; public int ID { get { return _id; } set { _id = value; } } public string AltroTag { get { return _altroTag; } set { _altroTag = value; } } } }
|
Gestione di un controllo dinamico
Codice sorgente - presumibilmente C# / VB.NET |
//Controllo MioCheckBox1
MioCheckBox mio = new MioCheckBox();
mio.Tag = "blabla";
mio.ID = panel.Controls.Count;
mio.AltroTag = "altro Tag";
mio.Click += new EventHandler(MioCheckClick);
panel.controls.add(mio);
//Come nell'esempio di carlo, quello di colorare i panel
void MioCheckClick(object sender, EventArgs e)
{
panel.Controls[((MioCheckBox)sender).ID].BackColor = (((MioCheckBox)sender).Checked) ? Color.Yellow : Color.Transparent;
}
|
|
Ho provato il controllo dinamico, è veramente versatile.
Posto il sorgente, con le solite labels Ultima modifica effettuata da Carlo il 29/05/2018 alle 5:46
in programmazione tutto è permesso |
|
Thejuster (Admin)
Guru^2
Messaggi: 2305
Iscritto: 04/05/2008
|
|
|
Ultimo (Member)
Guru
Messaggi: 877
Iscritto: 22/05/2010
|
Postato originariamente da Carlo:
Postato originariamente da Thejuster:
Per il discorso di prima, quello di aggiungere ulteriori campi ad un controllo,
Basta creare una semplice classe ed ereditare la classe del controllo più aggiungerci
una variabile pubblica
Codice sorgente - presumibilmente VB.NET |
class Class1 { public class MioCheckBox : CheckBox { private int _id; private string _altroTag; public int ID { get { return _id; } set { _id = value; } } public string AltroTag { get { return _altroTag; } set { _altroTag = value; } } } }
|
Gestione di un controllo dinamico
Codice sorgente - presumibilmente C# / VB.NET |
//Controllo MioCheckBox1
MioCheckBox mio = new MioCheckBox();
mio.Tag = "blabla";
mio.ID = panel.Controls.Count;
mio.AltroTag = "altro Tag";
mio.Click += new EventHandler(MioCheckClick);
panel.controls.add(mio);
//Come nell'esempio di carlo, quello di colorare i panel
void MioCheckClick(object sender, EventArgs e)
{
panel.Controls[((MioCheckBox)sender).ID].BackColor = (((MioCheckBox)sender).Checked) ? Color.Yellow : Color.Transparent;
}
|
|
Ho provato il controllo dinamico, è veramente versatile.
Posto il sorgente, con le solite labels |
Ottimo esempio Carlo
Mettilo in valutazione programmi come "Esempi"
If ok Then GOTO Avanza else GOTO Inizia
|
|