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") を使用して呼び出されます。これにより、名前に "Customers" が含まれていないツールストリップ アイテムが無効になります。

于 2013-01-25T02:11:44.487 に答える
1

答え:

非常に単純な再帰呼び出しで家に帰ります! 面倒で非常に複雑な 3 ページの C# コードを作成する必要はありません。私が書いたコード スニペットを次に示します。

すべてのフォームのコントロールを反復処理する for each ループを作成し、ループ内でこれを呼び出します。

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

重要な注意: 私が C# ではなく VB を選択した理由の 1 つは、C# は難読化された、複雑な、再読しにくいコードに向いているということです。気をつけてください)誰も理解できないコードを書くことにとても満足しています。

問題に対する複雑な C# ソリューションを見つけるたびに、私はそれを受け入れず、仕事を行うためのより簡単な方法を常に見つけます。はい、いつも、いつも...

于 2011-02-17T04:16:07.610 に答える
0

質問に誤りがあります。Toolstrip の項目は、コンポーネントから派生した ToolStripItem から継承されます。これらはコントロールではありません。そのため、ToolStrip.hasChildren は常に false を返し、一般にコントロールとして扱うことができません。私は同じタスクを持っています.ToolStripItem、MenuItemsなどを再帰的な方法で分離する必要があることは明らかです。不便だけど他に方法がない

于 2011-02-25T18:06:12.817 に答える