PDA

View Full Version : [C#] textbox


CL4UD1O83
07-04-2010, 17:32
Ciao a tutti,
ho un problema con i textbox in C#. E' possibile modificare "contemporaneamente" le proprietà di più textbox con una semplice istruzione? Mi spiego meglio, dato che foreach sui TextBox non funziona esiste una soluzione simile a:

foreach(TextBox t in GroupBox1)
{
t.ReadOnly = true;
}

anzichè dover ripetere la stessa istruzione per ogni TextBox del form?
Grazie in anticipo,

Claudio

MarcoGG
07-04-2010, 18:17
Ci eri andato vicino :
foreach (TextBox T in groupBox1.Controls)
{
T.ReadOnly = true;
}
;)

^TiGeRShArK^
07-04-2010, 18:33
ovvio che si, basta che carichi tutti i textbox in un array.
Oppure puoi accedere a tutti i figli del form di tipo textbox e iterare su quelli se hai creato tutto dal designer.
più facile a farsi che a dirsi :p

var textboxes = GroupBox1.Controls.OfType<Control>().Where(c => c is TextBox);
foreach (TextBox textbox in textboxes)
{
textbox.Text = "Ciao";
}

^TiGeRShArK^
07-04-2010, 18:35
Ci eri andato vicino :
foreach (TextBox T in groupBox1.Controls)
{
T.ReadOnly = true;
}
;)

Così però funziona solo se il groupbox contiene esclusivamente textbox :p

CL4UD1O83
07-04-2010, 18:45
Grazie mille a entrambi, tra l'altro non conoscevo l'uso di var... :fagiano:

CL4UD1O83
07-04-2010, 18:46
Così però funziona solo se il groupbox contiene esclusivamente textbox :p

vero! :cry:

^TiGeRShArK^
07-04-2010, 19:01
vero! :cry:

col mio codice funziona anche se ci sono altri controlli, dato che agisce solo su quelli di tipo textbox. :p

gugoXX
07-04-2010, 21:40
ovvio che si, basta che carichi tutti i textbox in un array.
Oppure puoi accedere a tutti i figli del form di tipo textbox e iterare su quelli se hai creato tutto dal designer.
più facile a farsi che a dirsi :p

var textboxes = GroupBox1.Controls.OfType<Control>().Where(c => c is TextBox);
foreach (TextBox textbox in textboxes)
{
textbox.Text = "Ciao";
}


Ehm...


var textboxes = GroupBox1.Controls.OfType<TextBox>();
foreach (TextBox textbox in textboxes)
{
textbox.Text = "Ciao";
}


:p

^TiGeRShArK^
07-04-2010, 21:41
Ehm...


var textboxes = GroupBox1.Controls.OfType<TextBox>();
foreach (TextBox textbox in textboxes)
{
textbox.Text = "Ciao";
}


:p

good idea :p

MarcoGG
07-04-2010, 22:22
Così però funziona solo se il groupbox contiene esclusivamente textbox :p

Mi sembrava fosse la richiesta di CL4UD1O83.

Se è previsto che groupBox1 possa contenere altri controlli, si può adattare facilmente, senza sprecare inutili Array di appoggio :

foreach (Control C in groupBox1.Controls)
{
if (C is TextBox) (C as TextBox).ReadOnly = true;
}
:p

gugoXX
07-04-2010, 23:00
Non sono array di appoggio.
Sono risolti tutti con la yield return al volo.

MarcoGG
08-04-2010, 08:38
Non sono array di appoggio.
Sono risolti tutti con la yield return al volo.

In ogni caso non vedo perchè creare un array di TextBox, quando si ha già un ForEach sul Container groupBox, e basta una riga di codice per fare tutto.

gugoXX
08-04-2010, 08:40
In ogni caso non vedo perchè creare un array di TextBox, quando si ha già un ForEach sul Container groupBox, e basta una riga di codice per fare tutto.

Non costruisce un array.
Quella sintassi restituisce un IEnumerable<TextBox>, dove viene in pratica eseguito proprio quanto da te scritto, e viene ciclato sopra di esso.
Non c'e' allocazione di memoria in mezzo, non c'e' alcuna "new" eseguita.

E piu' simile ad una pipeline.

MarcoGG
08-04-2010, 09:22
Non costruisce un array.
Quella sintassi restituisce un IEnumerable<TextBox>, dove viene in pratica eseguito proprio quanto da te scritto, e viene ciclato sopra di esso.
Non c'e' allocazione di memoria in mezzo, non c'e' alcuna "new" eseguita.

E piu' simile ad una pipeline.

Non discuto, ma a me pare un passaggio superfluo dire :
- Tra tutti i controlli di groupBox1 prendi il sottoinsieme "TextBox".
- Su tutte le textbox del sottoinsieme "TextBox" fai ReadOnly=true.

quando posso dire :
- Tra tutti i controlli di groupBox1, se c'è una TextBox, fai ReadOnly=true.

Poi, la mia convinzione rimane questa sul caso attuale. Ci saranno sicuramente casi in cui l'altra tecnica potrà essere vantaggiosa, se non addirittura indispensabile...

^TiGeRShArK^
08-04-2010, 13:28
a me risulta + leggibile quella con LINQ...
E comunque gli if vanno sempre eliminati quando possibile.