我创建了一个包含三个不同项的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并传递正确的操作,以及处理ContextMenuStap的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已经提到的,如果相同级别的TreeNode对象应该调用相同的方法,那么使用此属性来决定应该调用哪个方法。