【问题标题】:context menu with every right click vb.net每次右键单击 vb.net 的上下文菜单
【发布时间】:2015-12-06 07:10:36
【问题描述】:

我正在尝试将上下文菜单添加到 vb.net 中的树视图,但没有得到所需的行为。当我在树视图中右键单击时,我可以根据用户单击的位置获得一个带有不同选项的上下文菜单,但是如果用户单击树视图中的其他位置并且上下文菜单已经出现,则上下文菜单会简单地清除并执行不会重新出现在新的点击位置(就像在网络浏览器中多次右键单击一样)。

这是我目前所拥有的:

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

有没有办法在 vb.net 中获得这种行为?

【问题讨论】:

    标签: vb.net treeview behavior right-click


    【解决方案1】:

    我认为您不需要在MouseDown 事件中编写任何代码。您只需要做的是 - 在填充 TreeView 时为每个 Node 正确设置 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=" &amp; row.Item(0).ToString, row.Item(1).ToString).ContextMenuStrip = test5.我从作为数据表引入的表中填充 0 级和 1 级节点。
    • 是的,它有效。比方说,如果选择了 Main Node 并右键单击 Other Level 0 Node,那么 Other Level 0 Node 将获得焦点并被选中ContextMenu 将显示
    • treeviewMain.Nodes.Add("CategoryID=" &amp; row.Item(0).ToString, row.Item(1).ToString).ContextMenuStrip = test5 不正确!您首先创建了 Node 对象,将 ContextMenu 设置为它,然后添加到 TreeViewDim tmpNode As New TreeNode("CategoryID=" &amp; row.Item(0).ToString, row.Item(1).ToString())tmpNode.ContextMenuStrip = test5treeviewMain.Nodes.Add(tmpNode)
    猜你喜欢
    • 1970-01-01
    • 2016-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-15
    • 2017-04-22
    • 1970-01-01
    相关资源
    最近更新 更多