我用三个不同的项目创建了一个ContextMenuStrip。然后,我有一个带有父节点和子节点的TreeView。我将ContextMenuStrip分配给两个节点,如下所示:
fatherNode.ContextMenuStrip = menuNodes
childNode.ContextMenuStrip = menuNodes
问题在于,菜单项必须根据哪个节点调用菜单项而执行不同的操作。换句话说,例如,如果菜单上的第一项是“创建”,则如果父节点调用它,它将创建非常特定的内容,如果子节点调用相同的菜单项,它将创建不同的内容。
希望我能够解释我的意思,对不起,我没有任何代码,因为我不知道如何实现。
假设您有两种方法:
Private Sub ParentNodeMethod()
Console.WriteLine("Parent Node Method")
End Sub
Private Sub ChildNodeMethod()
Console.WriteLine("Child Node Method")
End Sub
...,并且您有一个用于TreeView控件的ContextMenuStrip,并且您想要一个特定的菜单栏项目(ToolStripMenuItem)调用-单击时-根据单击TreeNode的方式之一。
您可以利用Action委托并创建不同的动作,以调用不同的方法,并将它们分配给所涉及的TreeNode对象的Tag
属性,处理TreeView.NodeMouseClick以显示ContextMenuStrip并传递正确的动作,处理ContextMenuStrip的ItemClicked事件以调用它。
用以下代码替换您的代码:
'//
parentNode.Tag = New Action(AddressOf ParentNodeMethod)
childNode.Tag = New Action(AddressOf ChildNodeMethod)
'//
Private Sub TreeView1_NodeMouseClick(sender As Object,
e As TreeNodeMouseClickEventArgs) _
Handles TreeView1.NodeMouseClick
If e.Button = MouseButtons.Right AndAlso TypeOf e.Node.Tag Is Action Then
ContextMenuStrip1.Items(0).Tag = e.Node.Tag
ContextMenuStrip1.Show(TreeView1, e.Location)
End If
End Sub
Private Sub ContextMenuStrip1_ItemClicked(sender As Object,
e As ToolStripItemClickedEventArgs) _
Handles ContextMenuStrip1.ItemClicked
If TypeOf e.ClickedItem.Tag Is Action Then
DirectCast(e.ClickedItem.Tag, Action)()
e.ClickedItem.Tag = Nothing
End If
End Sub
另一种方法是创建Dictionary(Of TreeNode, Action)
而不是将操作分配给Tag
属性:
'Class member
Private ReadOnly dict As New Dictionary(Of TreeNode, Action)
'//
dict.Add(parentNode, New Action(AddressOf ParentNodeMethod))
dict.Add(childNode, New Action(AddressOf ChildNodeMethod))
'//
Private Sub TreeView1_NodeMouseClick(sender As Object,
e As TreeNodeMouseClickEventArgs) _
Handles TreeView1.NodeMouseClick
Dim a As Action = Nothing
If e.Button = MouseButtons.Right AndAlso dict.TryGetValue(e.Node, a) Then
ContextMenuStrip1.Items(0).Tag = a
ContextMenuStrip1.Show(TreeView1, e.Location)
End If
End Sub
Private Sub ContextMenuStrip1_ItemClicked(sender As Object,
e As ToolStripItemClickedEventArgs) _
Handles ContextMenuStrip1.ItemClicked
If TypeOf e.ClickedItem.Tag Is Action Then
DirectCast(e.ClickedItem.Tag, Action)()
e.ClickedItem.Tag = Nothing
End If
End Sub
或者,正如@Jimi所提到的,如果相同Level的TreeNode对象应调用相同的方法,则使用此属性来确定应调用哪个方法。