1

我只是注意到 hasChildren 方法不会返回工具条中的各种项目,只是因为我猜它不是容器。

SO中有一个答案,但在我看来它太复杂了。

有没有一种简单的方法来遍历工具条控件的控件?

4

3 回答 3

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") 调用该函数 - 这将禁用名称不包含“客户”的任何工具条项目。

于 2013-01-25T02:11:44.487 回答
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# 解决问题的方法时,我都不会接受它,我总是会找到一些更简单的方法来完成这项工作。是的,总是,总是……

于 2011-02-17T04:16:07.610 回答
0

问题有错误。Toolstrip 的 Item 继承自 ToolStripItem,ToolStripItem 又继承自组件。它们不是控件,这就是 ToolStrip.hasChildren 总是返回 false 的原因,这就是为什么它们通常不能被视为控件的原因。我有同样的任务,很清楚 ToolStripItem、MenuItems 等应该在递归方法中分开。不方便,但没有其他方法

于 2011-02-25T18:06:12.817 回答