Comment obtenir une liste de contrôles internes de contrôle d'outils par programmation
-
14-11-2019 - |
Question
Je viens de remarquer que la méthode Haschildren ne renvoie pas les différents éléments dans un Toolstrip, juste parce que ce n'est pas un conteneur, je suppose.
Il y a une réponse Ici dans So Mais il me semble que c'est beaucoup trop compliqué.
Y a-t-il Une manière simple pour itérer les contrôles du contrôle Toolstrip?
La solution 2
RÉPONSE:
Je rentre à la maison avec un appel récursif très simple! Pas besoin de lourds pages extrêmement compliquées C # Code Guys, voici l'extrait de code que j'ai écrit, et cela fonctionne:
Créez un pour chaque boucle pour parcourir tous les contrôles de tous les formulaires, et dans la boucle, appelez ceci:
Private Shared Sub recurseTranslateControls(ByVal lang As String, ByVal c As Control)
Dim newtxt as string = getLangItem(c.name, lang) ' This function performs string translation
' Nothing to do with the current post / answer
' This will work for "normal" controls
If newtxt <> "" Then
c.Text = newtxt ' Apply the translated text to the control
End If
If c.HasChildren Then
For Each co In c.Controls
' This will work for Toolstrip. You should do same for Menustrip etc.
If "toolstrip".Contains(co.GetType.Name.ToLower) Then
Dim ts As ToolStrip = co ' Toolstrip doesn't have child controls, but it DOES have ITEMS!
For Each itm As ToolStripItem In ts.Items
' No need for recursivity: toolstrip items doesn't have children
Call TranslateToolstrip(lang, itm) ' Apply the translated text to the toolstrip item
Next
Else
Call recurseTranslateControls(lang, co)
End If
Next
End If
End Sub
Private Shared Sub TranslateToolstrip(ByVal lang As String, ByVal t As ToolStripItem)
Dim newtxt = getLangItem(t.name, lang)
If newtxt <> "" Then
t.Text = newtxt
End If
End Sub
Remarque importante: L'une des raisons pour lesquelles j'ai choisi VB et non C # est que C # prête à un code obscur, complexe, difficile à relire, et en plus de cela, C # "soi-disant" gourous (pas les vrais Attention) sont si heureux d'écrire du code que personne ne peut comprendre.
Chaque fois que je trouve une solution C # complexe à un problème, je ne l'accepte pas et je trouve toujours un moyen plus simple de faire le travail. Oui, toujours, toujours ...
Autres conseils
J'ai récemment dû faire quelque chose de similaire et j'ai trouvé cette question. L'extrait de code suivant active ou désactive les éléments dans un ToolStrip selon que le nom de l'élément contient la variable STYPE.
Friend Sub ModifyEnabledControls(ByVal ts As ToolStrip, ByVal sType As String)
For Each c As ToolStripItem In ts.Items
If c.Name.Contains(sType) Then
c.Enabled = True
Else
c.Enabled = False
End If
Next
End Sub
La fonction est appelée Utilisation de ModifyEnabledControls (TOLLSTRIP1, "Clients") - qui désactiverait tout élément ToolStrip où le nom ne contient pas "clients".
Il y a une incorrecte dans la question. Les éléments de ToolStrip sont hérités de ToolSstripitem, qui à son tour est dérivé du composant. Ce ne sont pas des contrôles, c'est pourquoi Toolstrip.haschildren revient toujours faux et c'est pourquoi ils ne peuvent pas être traités généralement comme des contrôles. J'ai la même tâche, il est clair que ToolSstripitem, MenuItems et ainsi de suite doivent être séparés dans la méthode récursive. Pas pratique mais il n'y a pas d'autre moyen