Как получить список внутренних элементов управления панели инструментов

Я только что заметил, что метод hasChildren не возвращает различные элементы в панели инструментов, просто потому что это НЕ контейнер, я думаю.

В SO есть ответ, но он кажется мне слишком сложным.

Есть ли простой способ перебора элементов управления панели инструментов?

3 ответа

Решение

ОТВЕТ:

Я возвращаюсь домой с очень простым рекурсивным вызовом! Нет нужды в громоздких, чрезвычайно сложных 3-х страничных кодах на C#, вот фрагмент кода, который я написал, и он РАБОТАЕТ:

Создайте для каждого цикла цикл для всех элементов управления формы, а внутри цикла вызовите это:

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

Важное замечание: одна из причин, по которой я выбрал VB, а не C#, состоит в том, что C# предоставляет запутанный, сложный, трудно перечитываемый код, и, кроме того, так называемых "гуру" C# (не настоящих). заметь) так рады писать код, который никто не может понять.

Каждый раз, когда я нахожу сложное решение проблемы на языке C#, я не принимаю его, и ВСЕГДА нахожу какой-то более простой способ выполнить работу. Да, ВСЕГДА, ВСЕГДА...

Я недавно должен был сделать что-то подобное, и нашел этот вопрос. Следующий фрагмент кода включает или отключает элементы в панели инструментов в зависимости от того, содержит ли имя элемента переменную 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

Функция вызывается с использованием ModifyEnabledControls(ToolStrip1,"Customers"), который отключает любой элемент toolstrip, имя которого не содержит "Customers".

В этом вопросе есть неправильность. Элементы Toolstrip унаследованы от ToolStripItem, который, в свою очередь, является производным от компонента. Они не являются элементами управления, поэтому ToolStrip.hasChildren всегда возвращает false, и поэтому их нельзя рассматривать как элементы управления. У меня та же задача, ясно, что ToolStripItem, MenuItems и т. Д. Должны быть разделены рекурсивным методом. Не удобно, но другого пути нет

Другие вопросы по тегам