2012-10-11 4 views
1

J'ai un simple formulaire vb 2010 que je veux être en mesure de définir le activé indiqué de tous les boutons. J'ai effectué des fonctions similaires pour les cases à cocher et les commandes numériquesUpDown qui fonctionnent selon les besoins, mais pour les boutons, la fonction ne semble pas fonctionner correctement.état du bouton de réglage activé

Private Sub setButtonsState(ByVal state As Boolean) 
    Dim cControl As Control 
    For Each cControl In Me.Controls 
     If (TypeOf cControl Is Button) Then 
      cControl.Enabled = state 
     End If 
    Next cControl 
End Sub 

Ce qui est appelé comme ceci: setButtonsState(True) Cela ne marche pas semblent avoir un effet quelconque avec des boutons, si buttonName.Enabled = True fonctionne bien ... Im à peu près ce que vous appelez un noob à VB, donc tout le monde aide moi? Ta

Répondre

4

À moins que tous vos boutons appartiennent directement au formulaire ci est exécuté en , alors ils ne seront pas accessibles parce que cela ne descend pas à travers l'arbre de contrôle pour les atteindre. Une approche légèrement différente pourrait être une méthode plus récursive:

Private Sub setButtonsState(ByVal controls as System.Windows.Forms.Control.ControlCollection, ByVal state as Boolean) 

    For Each ctrl as Control in controls 
     If (ctrl.HasChildren) Then setButtonsState(ctrl.Controls, state) 

     If (TypeOf ctrl Is Button) Then ctrl.Enabled = state 
    Next 

End Sub 
+0

Cela pourrait être le cas car les boutons sont dans une zone de groupe. Cependant, une erreur est donnée "'HasControls' n'est pas un membre de 'System.Windows.Forms.Control'." ... – Toby

+1

Je pense qu'il pourrait signifier .haschildren Par exemple ... Si (ctrl.HasChildren) alors. ..*continuer. – Ccorock

+0

essayé de changer pour hasChildren, mais alors une exception pour invalidCast non gérée se produit pour setButtonsState (ctrl.Controls, état) – Toby

1

Cela fonctionne sur ma forme. Etes-vous sûr que vous définissez l'état sur une valeur réelle? vous voulez souvent faire varier une variable appelée "état" dans le sous-programme juste pour le tester. Définissez l'état sur true et désactivez tous vos boutons.

Essayez de récupérer le nombre de contrôles renvoyés. Pour vous assurer que vous faites correctement référence aux contrôles.

Démontrant booléen jeu True pour le test:

*Dim state As Boolean = True* 

    Dim cControl As Control 
    For Each cControl In Me.Controls 
     If (TypeOf cControl Is Button) Then 
      cControl.Enabled = state 
     End If 
    Next cControl 

Vérifiez le nombre de contrôles:

For Each cControl In (Your Form Name Ex. FrmMain1).Controls 
        If (TypeOf cControl Is Button) Then 
         cControl.Enabled = state 
         *debug.writeline(cControl.Name)* 
        End If 
       Next cControl 
+0

en utilisant le nom de forme donne une erreur: « « Test1.FormName » ne peut pas se référer à lui-même par son instance par défaut, l'utilisation « moi » au lieu » – Toby

+0

réglage state = vrai à l'intérieur du sous-marin ne fonctionne pas non plus, donc doit être la logique elle-même, ce qui est étrange car cela a fonctionné pour tous les autres types de contrôle que j'ai essayé jusqu'à présent ... merci pour votre aide. – Toby

+1

Grattez ça alors. Essayez plutôt debug.writeline (Button1.Parent.Name.Tostring) cela devrait justifier si le formulaire est en fait le parent de ce contrôle, sinon il vous donnera le parent du contrôle. – Ccorock

0

Je vous suggère d'éviter la récursivité, si possible. L'approche ci-dessous a une meilleure capacité de débogage.

Tout d'abord, Linearise ControlCollection tree dans le tableau de contrôle - méthode d'extension générique, pas de récursivité, LINQ ou GetNextControl.

Ensuite, vous pouvez écrire comme ceci:

Private Sub setButtonsState(ByVal controls As ControlCollection, ByVal state As Boolean) 
    For Each ctrl As Control In controls.GetAllControlsOfType(Of Button)() 
    ctrl.Enabled = state 
    Next 
End Sub 
+0

En tant que noob deux Q A) pourquoi éviter la récursion B) Dans votre eg n'est pas la récursivité juste déplacé de l'état de changement sub dans le sub getAllControlsOfType? Ta – Toby

+1

@Toby: A) parce que vous ne pouvez pas facilement le déboguer, supposons que vous avez 100 boutons imbriqués dans 9 niveaux. Avec la récursivité, vous ne savez même pas s'ils ont tous été récupérés par votre code. Avec l'approche ci-dessus, vous pouvez les voir tous dans l'écran de surveillance, voir le nombre de boutons, etc. B) Non, getAllControlsOfType ne s'appelle pas lui-même. – Neolisk

+0

Merci @ Neolisk :) – Toby

Questions connexes