Puntare su pulsanti, label e controlli in una form

mercoledì 10 gennaio 2007 - 19.20

Dav-ide Profilo | Junior Member

Salve a tutti, volevo chiedere se è possibile puntare tutti i pulsanti in un for senza starne a richiamare uno per uno.
Per spiegarmi, volevo trovare al volo quale pulsante, label o altro ha la proprietà tag <> ""
Il mio codice dovrebbe essere:

FOR I = 0 TO nPulsantiNelForm IF nPulsantiNelForm(I).tag <> "" THEN nPulsantiNelForm.Enabled = False END IF NEXT I

...o qualcosa del genere, ma non ho trovato nulla....
Dimenticavo: uso vb2005
Grazie
Davide

maurosegato Profilo | Newbie

il codice che ti serve è:

for each ctrl as Control in me.Controls
if ctrl.GetType().Equals(gettype(Button)) andalso not ctrl.tag is nothing andalso ctrl.Tag.Equals('....oggetto di confronto....')
ctrl.Enabled = false
end if
next

ciao
Mauro Segato

Dav-ide Profilo | Junior Member

Ho provato il tuo codice e l'ho sintetizzato in questo modo:

For Each ctrl As Control In Me.Controls If Not ctrl.Tag Is Nothing AndAlso CInt(ctrl.Tag) > 3 Then ctrl.Enabled = False Else ctrl.Enabled = True End If Next

Il problema è che se nel form c'è un pulsante dove il campo tag è nullo mi torna il seguente errore evidenziandomi la riga dell'If
InvalidCastException non è stata gestita. Cast non valido dalla stringa "" al tipo 'Double'. Da analisi che ho fatto il problema è qua:
CInt(ctrl.Tag) > 3, ma non capisco il perchè....

alextyx Profilo | Expert

Il consiglio di maurosegato è corretto.
Per completezza, però devi considerare che alcuni controlli possono appartenere alla collezione di controlli di un panel, ad esempio e non verranno trovati ciclando solo su 'me.controls'. Ogni volta che ti posizioni su un controllo, devi cercare eventuali controlli contenuti in esso. La cosa può valere fino ad un numero indefinito di livelli, anche se, tipicamente saranno 2 o 3.

Io adotto una tecnica particolare di utilizzo del tag, in alcune applicazioni. Scrivo, ad esempio nel tag di una textbox: -BL0-BL1-SB2-SB3- (in fase di progettazione)
Poi progetto l'applicazione definendola a stati: Stato1=Visualizzazione Iniziale, Stato2=E'stato selezionato un record, ecc... e una routine generica che scorre tutti i controlli guardandone il tag, BLocca o SBlocca il controllo a seconda dello stato in cui ci si trova.
Anzichè andare a scrivere righe e righe di BtnPippo.Visible=False e roba simile in varie zone del programma. Penso sia quello che stai cercando di fare tu, o qualcosa di simile. Ti passo il codice che uso io. Ci sono particolarità che servono solo a me (quel confronto con -READONLY- serve per un mio controllo personalizzato e basta). Puoi chiamare il metodo che abilita disabilita, o quello che nasconde/mostra, scrivendo cose diverse nel tag.
Non è pulitissima, è una classettina per uso mio e ci saranno cose da rivedere, che non ho mai il tempo di affrontare, ma spero ti sia di aiuto, almeno come ispirazione:

Il codice sorgente non è stato renderizzato qui
perchè non c'è sufficiente spazio.
Clicca qui per visualizzarlo in una nuova finestra

Dav-ide Profilo | Junior Member

Si, perfetto... quello che voglio fare io è proprio disabilita e abilitare i controlli in modo semplice senza stare a richiamarne uno ad uno.... (fondamentalmente disabilitare i controlli in base al livello dell'utente loggato...)
Il tuo esempio è perfetto... Non mastico molto questo linguaggio e non ho mai avuto a che fare con classi, però per ora ti ringrazio e sicuramente l'ispirazione c'è.
A buon rendere e buon lavoro!
Davide

maurosegato Profilo | Newbie

hai ragione...

richiami: SetControlsState(me)...

public overloads sub SetControlsState(byval f as Form)
For Each ctrl As Control In f.Controls
SetControlsState(ctrl) '//Ricorsione
If Not ctrl.Tag Is Nothing AndAlso IsNumeric(ctrl.Tag) andalso CInt(ctrl.Tag) > 3 Then
ctrl.Enabled = False
Else
ctrl.Enabled = True
End If
Next
end sub
public overloads sub SetControlsState(byval parentControl as Control)
For Each ctrl As Control In parentControl.Controls
SetControlsState(ctrl.Controls) '//Ricorsione
If Not ctrl.Tag Is Nothing AndAlso IsNumeric(ctrl.Tag) andalso CInt(ctrl.Tag) > 3 Then
ctrl.Enabled = False
Else
ctrl.Enabled = True
End If
Next
end sub

Mauro Segato

Dav-ide Profilo | Junior Member

Ho aggiunto IsNumeric(ctrl.Tag) nell'if ed ora tutto sembra funzionare correttamente....
Non ho ben capito però perchè utilizzi una ricorsione....

maurosegato Profilo | Newbie

per controllare su un controllo posizionato nel form è a sua volta un contenitore di controlli.. es. un oggetto panel....
felice di esserti stato d'aiuto!
ciao
Mauro Segato

Dav-ide Profilo | Junior Member

Grazie mille!!!

alextyx Profilo | Expert

Ehm... sì, tutto ok...ma te l'avevo già scritto:
"Per completezza, però devi considerare che alcuni controlli possono appartenere alla collezione di controlli di un panel, ad esempio e non verranno trovati ciclando solo su 'me.controls'. Ogni volta che ti posizioni su un controllo, devi cercare eventuali controlli contenuti in esso. "
Le procedure che ti ho passato infatti, adottano già un algoritmo ricorsivo!
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-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5