Comment obtenir une liste de contrôles internes de contrôle d'outils par programmation

StackOverflow https://stackoverflow.com/questions/5022621

  •  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?

Était-ce utile?

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top