Как программно получить список внутренних элементов управления панели инструментов - PullRequest
1 голос
/ 17 февраля 2011

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

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

Существует ли простой способ для перебора элементов управления панели инструментов?

Ответы [ 3 ]

2 голосов
/ 25 января 2013

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

1 голос
/ 17 февраля 2011

ОТВЕТ:

Я возвращаюсь домой с очень простым рекурсивным вызовом! Нет необходимости в громоздких, чрезвычайно сложных 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 #, я не принимаю его, и ВСЕГДА нахожу какой-то более простой способ выполнить работу. Да, ВСЕГДА, ВСЕГДА ...

0 голосов
/ 25 февраля 2011

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

...