每次右键单击vb.net时的上下文菜单

每次右键单击vb.net时的上下文菜单,vb.net,treeview,behavior,right-click,Vb.net,Treeview,Behavior,Right Click,我试图在vb.net中将上下文菜单添加到树状视图中,但没有获得所需的行为。当我在树状视图中右键单击时,我可以根据用户单击的位置,使用不同的选项显示上下文菜单,但是如果用户单击树状视图中的其他位置,并且上下文菜单已经打开,则上下文菜单将被清除,并且不会重新出现在新单击的位置(很像在web浏览器中多次单击鼠标右键) 这就是我到目前为止所做的: Private Sub treeviewMain_MouseDown(sender As Object, e As System.Windows.Forms.

我试图在vb.net中将上下文菜单添加到树状视图中,但没有获得所需的行为。当我在树状视图中右键单击时,我可以根据用户单击的位置,使用不同的选项显示上下文菜单,但是如果用户单击树状视图中的其他位置,并且上下文菜单已经打开,则上下文菜单将被清除,并且不会重新出现在新单击的位置(很像在web浏览器中多次单击鼠标右键)

这就是我到目前为止所做的:

Private Sub treeviewMain_MouseDown(sender As Object, e As System.Windows.Forms.MouseEventArgs) Handles treeviewMain.MouseDown

    If e.Button = Windows.Forms.MouseButtons.Right Then
       'Determine which tree structure is loaded in tree view.
        If (treeviewMain.Nodes.Item(0).Name = "MainNode") Then
            Test(sender, e)
        Else
            OtherTest(sender, e)
        End If
    End If
End Sub

Private Sub Test(sender As Object, e As System.Windows.Forms.MouseEventArgs)

    Dim Context As ContextMenu = New ContextMenu
    Dim NodeClicked As TreeNode

    NodeClicked = Me.tvwMain.GetNodeAt(e.X, e.Y)

    If NodeClicked Is Nothing Then
        Context.MenuItems.Add("New Item")
        Context.Show(treeviewMain, e.Location)
    ElseIf NodeClicked.Name = "MainNode" Then
        tvwMain.SelectedNode = NodeClicked
        Context.MenuItems.Add("New Item")
        Context.Show(treeviewMain, e.Location)
    ElseIf NodeClicked.Level = 0 And NodeClicked.Name <> "MainNode" Then
        tvwMain.SelectedNode = NodeClicked
        Context.MenuItems.Add("Rename")
        Context.MenuItems.Add("Delete")
        Context.MenuItems.Add("-")
        Context.MenuItems.Add("New")
        Context.Show(treeviewMain, e.Location)
    ElseIf NodeClicked.Level = 1 Then
        tvwMain.SelectedNode = NodeClicked
        Context.MenuItems.Add("Edit")
        Context.MenuItems.Add("Copy")
        Context.MenuItems.Add("Delete")
        Context.Show(treeviewMain, e.Location)
    End If
End Sub
Private子树eviewmain\u MouseDown(发送者作为对象,e作为System.Windows.Forms.MouseEventArgs)处理树eviewmain.MouseDown
如果e.Button=Windows.Forms.MouseButtons.Right,则
'确定树视图中加载的树结构。
如果(treeviewMain.Nodes.Item(0).Name=“MainNode”),则
测试(发送者,e)
其他的
其他测试(发送方,e)
如果结束
如果结束
端接头
私有子测试(发送方作为对象,e作为System.Windows.Forms.MouseEventArgs)
将上下文设置为上下文菜单=新建上下文菜单
朦胧的点点滴滴像树状物
NodeClicked=Me.tvwMain.GetNodeAt(e.X,e.Y)
如果NodeClicked算不了什么
Context.MenuItems.Add(“新项”)
Context.Show(treeviewMain,e.Location)
ElseIf NodeClicked.Name=“MainNode”然后
tvwMain.SelectedNode=NodeClicked
Context.MenuItems.Add(“新项”)
Context.Show(treeviewMain,e.Location)
ElseIf NodeClicked.Level=0且NodeClicked.Name为“MainNode”
tvwMain.SelectedNode=NodeClicked
Context.MenuItems.Add(“重命名”)
Context.MenuItems.Add(“删除”)
Context.MenuItems.Add(“-”)
Context.MenuItems.Add(“新建”)
Context.Show(treeviewMain,e.Location)
ElseIf NodeClicked.Level=1然后
tvwMain.SelectedNode=NodeClicked
Context.MenuItems.Add(“编辑”)
Context.MenuItems.Add(“复制”)
Context.MenuItems.Add(“删除”)
Context.Show(treeviewMain,e.Location)
如果结束
端接头

在vb.net中是否存在这种行为?

我认为您不需要在
MouseDown
事件中编写任何代码。您只需要在填充
TreeView
时为每个
节点正确设置
ContextMenu

如果我是你,我会做这样的事

    ContextMenuStrip1.Items.Add("New Item")

    ContextMenuStrip2.Items.Add("Rename")
    ContextMenuStrip2.Items.Add("Delete")
    ContextMenuStrip2.Items.Add("-")
    ContextMenuStrip2.Items.Add("New")

    ContextMenuStrip3.Items.Add("Edit")
    ContextMenuStrip3.Items.Add("Copy")
    ContextMenuStrip3.Items.Add("Delete")

    Dim mainNode As New TreeNode("Main Node")
    mainNode.Name = "MainNode"
    mainNode.ContextMenuStrip = ContextMenuStrip1

    Dim level0Node As New TreeNode("Other Level 0 Node")
    level0Node.ContextMenuStrip = ContextMenuStrip2

    Dim level1NodeOfMain As New TreeNode("Level 1 Node Under Main Node")
    level1NodeOfMain.ContextMenuStrip = ContextMenuStrip3

    Dim level1NodeOfOther As New TreeNode("Level 1 Node Under Other Level 0")
    level1NodeOfOther.ContextMenuStrip = ContextMenuStrip3

    mainNode.Nodes.Add(level1NodeOfMain)
    level0Node.Nodes.Add(level1NodeOfOther)

    treeviewMain.Nodes.Add(mainNode)
    treeviewMain.Nodes.Add(level0Node)

    treeviewMain.ContextMenuStrip = ContextMenuStrip1 'you can remove this line if you don't want to show ContextMenu if user clicks not on the Nodes

我想我仍然需要在鼠标按下事件中使用代码来更改右键单击时节点的焦点。是否需要这样做?
treeviewMain.Nodes.Add(“CategoryID=“&row.Item(0).ToString,row.Item(1).ToString).ContextMenuStrip=test5
。我从作为datatable引入的表中填充0级和1级节点。是的,它可以工作。比方说,如果选择了主节点,然后右键单击其他0级节点,则其他0级节点将获得焦点并被选中,ContextMenu将显示
treeviewMain.nodes.Add(“CategoryID=”和row.Item(0).ToString,row.Item(1).ToString.ContextMenuStrip=test5
不正确!您必须先创建节点对象,将ContextMenu设置为该对象,然后添加到树视图中。
将tmpNode设置为新树节点(“CategoryID=”&row.Item(0).ToString,row.Item(1).ToString())
tmpNode.ContextMenuStrip=test5
treeviewMain.Nodes.add(tmpNode)