ToolStrip和派生控件MenuStrip、ContextMenuStrip、StatusStrip的项目集合是ToolStripItemCollection ,它具有用于深度搜索的Find方法,就像ControlCollection.Find方法一样。因此,您必须通过上述控件的Items属性搜索此集合,以查找ToolStripItem或任何派生类型。
为上述类创建搜索功能:
Public Function GetToolStripItem(toolStrip As ToolStrip, key As String) As ToolStripItem
Return toolStrip.Items.Find(key, True).FirstOrDefault
End Function
...并按如下方式调用它:
'Search a MenuStrip
Dim tsi = GetToolStripItem(MenuStrip1, key)
'Search a ToolStrip
Dim tsi = GetToolStripItem(ToolStrip1, key)
'Search a ContextMenuStrip
Dim tsi = GetToolStripItem(ContextMenuStrip1, key)
'Search a StatusStrip
Dim tsi = GetToolStripItem(StatusStrip1, key)
If tsi IsNot Nothing Then
tsi.Enabled = False
End If
此外,您可以使用TypeOf运算符来确定项目的类型:
If TypeOf tsi Is ToolStripMenuItem Then
'...
End If
If TypeOf tsi Is ToolStripDropDownItem Then
'...
End If
If TypeOf tsi Is ToolStripButton Then
'...
End If
...并使用迭代器函数从集合中获取所有或特定类型的项目:
Public Iterator Function GetAllToolStripItems(items As ToolStripItemCollection) As _
IEnumerable(Of ToolStripItem)
For Each tsi As ToolStripItem In items
Yield tsi
If TypeOf tsi Is ToolStripDropDownItem Then
For Each ddi As ToolStripItem In
GetAllToolStripItems(DirectCast(tsi, ToolStripDropDownItem).DropDownItems)
Yield ddi
Next
End If
Next
End Function
Public Iterator Function GetAllToolStripItems(Of T)(items As ToolStripItemCollection) As _
IEnumerable(Of T)
For Each tsi In items
If TypeOf tsi Is T Then
Yield DirectCast(tsi, T)
ElseIf TypeOf tsi Is ToolStripDropDownItem Then
For Each ddi In
GetAllToolStripItems(Of T)(DirectCast(tsi, ToolStripDropDownItem).DropDownItems)
Yield ddi
Next
End If
Next
End Function
...以及用法:
'Get them all...
Dim items = GetAllToolStripItems(TooStrip1.Items) 'or any derived control...
'Get for example the ToolStripComboBox items...
Dim items = GetAllToolStripItems(Of ToolStripComboBox)(MenuStrip1.Items)
请注意,在迭代器中,识别ToolStripDropDownItem是获取派生类的 ToolStripItemCollection 所必需的,包括:
每个都继承DropDownItems属性,当然应该将其传递给迭代器。