我正在尝试将所有项目从 ContextMenuStrip 提取到List(Of ToolStripMenuItem)
.
我可以获得 DataGridView 的 ContextMenuStrip 的引用,然后 - 使用递归函数 - 我想提取所有 的Name
和Text
属性,如果有的话ToolStripMenuItems
,不包括。ToolStripSeparators
我使用这段代码:
allItem = New List(Of Control)
Dim lstDbg As List(Of Control) = FindControlRecursive(allItem, form, GetType(DataGridView))
Dim dictRes As New Dictionary(Of String, String)
For Each dbgCtrl As Control In lstDbg
If dbgCtrl.Name <> "" Then
For Each mnuStrip As ToolStripItem In dbgCtrl.ContextMenuStrip.Items
If mnuStrip.GetType() = GetType(ToolStripMenuItem) Then
Dim lstItem As New List(Of ToolStripMenuItem)
Dim lstTS As List(Of ToolStripMenuItem) = FindControlRecursive_ContextMenu(lstItem, mnuStrip, GetType(ToolStripMenuItem))
For Each item As ToolStripMenuItem In lstTS
dictRes.Add(item.Name, item.Text)
Next
End If
Next
End If
Next
递归的功能是FindControlRecursive_ContextMenu()
:
Public Function FindControlRecursive_ContextMenu(ByVal list As List(Of ToolStripMenuItem), ByVal parent As ToolStripMenuItem, ByVal ctrlType As System.Type) As List(Of ToolStripMenuItem)
If parent Is Nothing Then Return list
If parent.GetType Is ctrlType Then
list.Add(parent)
End If
For Each child As ToolStripMenuItem In parent.DropDown.Items
FindControlRecursive_ContextMenu(list, child, ctrlType)
Next
Return list
End Function
它可以工作,但是如果在 DropDown 列表中有一个ToolStripSeparator
,我没有该DropDown.Items
元素并且该函数会生成异常。
如何跳过 ToolStripSeparators 并使用下一个“孩子”调用递归函数?