Lista controlli personalizzati in winform

venerdì 06 giugno 2008 - 20.55

AndreaKpr Profilo | Senior Member


Ciao Raga.
Sto implementando un aplicazione WinForm in cui ho, anche in una sola form, 50 / 60 Textbox.
Le textbox implementano (ognuno solo una ) tre interfaccie.
Per un determinato calcolo debbo girarmi tutte le txt box prelevare il dato contenuto (fare un calcolo) ed esportare un Xml.
Ovvimente non pensavo di fare tutto a mano ma cercavo di sfruttare la collezione degli oggetti della form.
Solo che è un pochino lentuccio a sto punto
pensavo di utilizzare la "form.control.find" ma mi sono reso conto che mi permette di cercare un solo oggetto alla volta
MI chiedevo se qualcuno conosce il modo per poter cercare degli oggetti pasando o il tipo od il nome di un interfaccia. ???
Tnx !!!

aiedail92 Profilo | Expert

Ciao

potresti usare un ciclo foreach fra i controlli della Form:

foreach(IInterface elem in tuaForm.Controls) { //codice } foreach(TextBox elem in tuaForm.Controls) { //codice }

Col primo ottieni tutti i controlli che implementano IInterface, con il secondo tutte le TextBox, ma potresti specializzarlo per trovare le tue CustomTextBox

Luca

AndreaKpr Profilo | Senior Member

Ciao aiedail92 e grazie per la risposta.

Quando ho letto la tua soluzione mi si è accesa una lampadina !!! ;o)
Purtoppo però il ciclo mi ritorna un eccezzione... Probabilmente non ho ben afferrato il contetto.
Ho creato una form con 4 textbox che implementano "MiaInferfaccia" ed un bottone.
Ti posto due righe :

>>>foreach (MiaInferfaccia Obj in MiaForm.Controls)
>>>{
>>>>>>MessageBox.Show(Obj.PureData.ToString());
>>>}

Dove "PureData" è un metodo dell'interfaccia.
Tutto funziona fino a quando non incontro il bottone nella "MiaForm.Controls"
Eccezione :

>>> Unable to cast object of type 'System.Windows.Forms.Button' to type 'MieiControls.MiaTextBox'.

Mi pare di capire che non effettua un "filtro" sui controlli in maschera che implementano la "MiaInferfaccia",
ma che se li passa tutti e cerca di castare l'oggetto ...

Spero di essermi spiegato bene vista l'ora :o)
Domani mattina ci riprovo, notte !!! :o)))

Andrea

aiedail92 Profilo | Expert

Hai ragione, allora risolvi così:

foreach(Control c in TuaForm.Controls) { TuaInterfaccia elem = c as TuaInterfaccia; if(elem != null) { //Codice } }

Luca

AndreaKpr Profilo | Senior Member


Ciao Luca, Si cosi è ok.
Ma è del tutto simile alla mia base di partenza...
cioè passare tutti gli oggetti della form e controlla che il tipo sia uno di quelli da me costruiti.
Speravo che si potesse fare una specie di filtro in fase di lettura degli oggetti della form.
Ora mi è venuta un idea... ma se sul costruttore aggiungo l'oggetto stesso ad una collezione ???
E poi sull' elaboraxione ciclo su di essa ???
Che ne dici ???

aiedail92 Profilo | Expert

Certo, potresti anche fare in quel modo.

Invece, nel caso ti trovi a lavorare col FrameWork 3.5, potresti usare il metodo di estensione OfType<T>, che restituisce un IEnumerable con dentro tutti gli elementi di typo T; per esempio:

foreach (IInterfaccia elem in tuaForm.Controls.OfType<IInterfaccia>()) { //codice }

Naturalmente unire tutti gli oggetti in una collezione e iterare in quella è molto più veloce che ricercarli ogni volta, quindi se puoi farlo senza grossi problemi ti conviene decisamente.

Luca
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2025
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5