Как получить список внутренних элементов управления панели инструментов
Я только что заметил, что метод 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 и т. Д. Должны быть разделены рекурсивным методом. Не удобно, но другого пути нет