2010-01-30 8 views
2

Je suis en train de traduire mon application VB.Net et j'ai besoin de parcourir tous les contrôles de mon formulaire. En utilisant une fonction récursive telle queVB.Net: Boucler tous les éléments de formulaire, y compris CommonDialogs

Public Sub TranslateControl(ByVal Ctrl As Control) 
    For Each ChildCtrl As Control In Ctrl.Controls 
     ChildCtrl.Text = Translate(ChildCtrl.Text) 

     If TypeOf ChildCtrl Is Label Then 
      CType(ChildCtrl, Label).Tag = Translate(CType(ChildCtrl, Label).Tag) 
     End If 

     TranslateControl(ChildCtrl) 
    Next 
End Sub 

fonctionne très bien, mais il ne comprend pas les objets CommonDialog, tels que FolderBrowser objets. Comment puis-je accéder à ces objets? J'ai essayé

For Each ChildDialog As CommonDialog In Ctrl.Controls 
     ChildDialog.Tag = Translate(ChildDialog.Tag) 
    Next 

Mais il y a évidemment un problème d'héritage, car les objets ne sont pas CommonDialogcontrols.

Y a-t-il un moyen pour moi de boucler vraiment tous les éléments affichés sur mon formulaire?

Merci beaucoup!

CFP

Répondre

1

Non, ils sont des composants, et non pas les contrôles. Leur code vit en réalité dans le shell, ils ont été écrits en C/C++ non géré par Microsoft. La seule chose qui est gérée à leur sujet est un petit wrapper qui fait les appels API nécessaires pour les afficher et retourner leur résultat. OpenFileDialog par exemple.

Le tout premier problème que vous rencontrerez est l'exécution de votre code lorsqu'une telle boîte de dialogue est affichée. C'est un dialogue, le contrôle ne retourne pas à votre programme après l'appel ShowDialog() jusqu'à ce que l'utilisateur le rejette. C'est possible avec beaucoup de tromperie. Vérifiez mon code au this thread pour l'approche. Comme indiqué, ce code fonctionnera pour n'importe quelle boîte de dialogue de shell, ainsi que MessageBox.

Vous obtenez ainsi le handle de fenêtre de la boîte de dialogue. Ensuite, vous devez répéter les fenêtres enfants de la boîte de dialogue. Vous pouvez le faire avec l'appel de l'API EnumChildWindows. Cela vous donne le handle de fenêtre de chaque enfant, vous pouvez ensuite utiliser SendMessage() pour faire quelque chose avec l'enfant. Quoi que cela puisse être, vous ne l'avez pas précisé dans votre question.

+0

Merci pour votre réponse! Cependant, je dois avoir mal formulé ma question. Ce que je voulais dire était: J'ai déjà un moyen d'énumérer les contrôles sur mon formulaire. Toutefois, cette méthode énumère uniquement les contrôles et pas tous les éléments. Je suis à la recherche d'une méthode pour également énumérer d'autres éléments qui apparaissent sur mon formulaire, comme 'FolderBrowserDialog', aussi. Par exemple, supposons que j'ai un formulaire avec une étiquette et un bouton Parcourir qui affiche un objet FolderBrowserDialog. Je voudrais pouvoir lister tous les éléments qui sont sur le formulaire, y compris le FolderBrowser. Merci! –

+0

Sans blague. Vous pouvez itérer certains des composants du formulaire en itérant Me.components.Components. Cela ne donne pas les objets de dialogue, ils ne sont pas ajoutés à la collection. Seule la réflexion va les déterrer hors de l'objet de forme. –

+0

Hmmmm. OK merci! –

-2
Friend Sub resetFormControls(zForm As Form) 

Essayez un sous-programme pour réinitialiser tous les contrôles revenir à l'état non utilisé: zone de texte vide, sans contrôle et RadioButton case, etc.

 For Each zCntl As Control In zForm.Controls 
      If zCntl.HasChildren Then 
       For Each zChildCntl As Control In zCntl.Controls 
        If zChildCntl.GetType Is GetType(CheckBox) Then 
         CType(zChildCntl, CheckBox).Checked = False 
        End If 

        If zChildCntl.GetType Is GetType(TextBox) Then CType(zChildCntl, TextBox).Text = "" 
        If zChildCntl.GetType Is GetType(TextBox) Then CType(zChildCntl, TextBox).BackColor = Color.White 
        If zChildCntl.GetType Is GetType(RichTextBox) Then CType(zChildCntl, RichTextBox).Text = "" 
        If zChildCntl.GetType Is GetType(RichTextBox) Then CType(zChildCntl, RichTextBox).BackColor = Color.White 
        If zChildCntl.GetType Is GetType(RadioButton) Then CType(zChildCntl, RadioButton).Checked = False 

       Next 
      End If 
      If zCntl.GetType Is GetType(CheckBox) Then CType(zCntl, CheckBox).Checked = False 
      If zCntl.GetType Is GetType(TextBox) Then CType(zCntl, TextBox).Text = "" 
      If zCntl.GetType Is GetType(TextBox) Then CType(zCntl, TextBox).BackColor = Color.White 
      If zCntl.GetType Is GetType(RichTextBox) Then CType(zCntl, RichTextBox).Text = "" 
      If zCntl.GetType Is GetType(RichTextBox) Then CType(zCntl, RichTextBox).BackColor = Color.White 
      If zCntl.GetType Is GetType(RadioButton) Then CType(zCntl, RadioButton).Checked = False 
      If zCntl.GetType Is GetType(DateTimePicker) Then CType(zCntl, DateTimePicker).Text = Now.Date 
      If zCntl.GetType Is GetType(ComboBox) Then CType(zCntl, ComboBox).SelectedIndex = 0 

     Next 
     Application.DoEvents() 

    Catch ex As Exception 

    End Try 
End Sub 
+1

Peut-être devriez-vous revoir votre formatage. –

+0

Cela ne semble pas résoudre le problème, car l'OP a déjà utilisé la collection 'Controls'. –

Questions connexes