ContextMenuStrip项,根据调用它的人来执行不同的操作

问题描述 投票:0回答:1

我用三个不同的项目创建了一个ContextMenuStrip。然后,我有一个带有父节点和子节点的TreeView。我将ContextMenuStrip分配给两个节点,如下所示:

fatherNode.ContextMenuStrip = menuNodes
childNode.ContextMenuStrip = menuNodes

问题在于,菜单项必须根据哪个节点调用菜单项而执行不同的操作。换句话说,例如,如果菜单上的第一项是“创建”,则如果父节点调用它,它将创建非常特定的内容,如果子节点调用相同的菜单项,它将创建不同的内容。

希望我能够解释我的意思,对不起,我没有任何代码,因为我不知道如何实现。

.net vb.net treeview contextmenustrip
1个回答
0
投票

假设您有两种方法:

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对象应调用相同的方法,则使用此属性来确定应调用哪个方法。

© www.soinside.com 2019 - 2024. All rights reserved.