hasChildrenメソッドは、私が推測するコンテナではないという理由だけで、ツールストリップ内のさまざまなアイテムを返さないことに気づきました。
ここSOに答えがありますが、私にはあまりにも複雑すぎるようです。
ツールストリップコントロールのコントロールを反復処理する簡単な方法はありますか?
hasChildrenメソッドは、私が推測するコンテナではないという理由だけで、ツールストリップ内のさまざまなアイテムを返さないことに気づきました。
ここSOに答えがありますが、私にはあまりにも複雑すぎるようです。
ツールストリップコントロールのコントロールを反復処理する簡単な方法はありますか?
私は最近、似たようなことをしなければならず、この質問を見つけました。次のコード スニペットは、アイテム名に 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" が含まれていないツールストリップ アイテムが無効になります。
答え:
非常に単純な再帰呼び出しで家に帰ります! 面倒で非常に複雑な 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# ソリューションを見つけるたびに、私はそれを受け入れず、仕事を行うためのより簡単な方法を常に見つけます。はい、いつも、いつも...
質問に誤りがあります。Toolstrip の項目は、コンポーネントから派生した ToolStripItem から継承されます。これらはコントロールではありません。そのため、ToolStrip.hasChildren は常に false を返し、一般にコントロールとして扱うことができません。私は同じタスクを持っています.ToolStripItem、MenuItemsなどを再帰的な方法で分離する必要があることは明らかです。不便だけど他に方法がない