答案 0 :(得分:2)
我最近不得不做类似的事情,并发现了这个问题。以下代码段启用或禁用工具条中的项目,具体取决于项目名称是否包含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”)调用该函数 - 这将禁用名称不包含“Customers”的任何工具条项。
答案 1 :(得分:1)
解答:
我带着一个非常简单的递归电话回家了! 不需要麻烦的极其复杂的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#解决方案时,我都不接受它,而且我总是找到一些更简单的方法来完成这项工作。 是的,总是,总是......
答案 2 :(得分:0)
问题不正确。 Tooltrip的项目继承自ToolStripItem,而ToolStripItem又来自组件。它们不是控件,这就是为什么ToolStrip.hasChildren总是返回false,这就是为什么它们通常不能被视为控件。我有相同的任务,很明显ToolStripItem,MenuItems等应该在递归方法中分开。不方便,但没有其他办法