2015-12-06 110 views
0

我想添加一個上下文菜單到vb.net樹視圖,但沒有得到所需的行爲。當我在樹形視圖中右鍵單擊時,我可以根據用戶點擊的位置使用不同的選項顯示上下文菜單,但是如果用戶在樹視圖中的其他位置單擊並且上下文菜單已經啓動,則上下文菜單會簡單地清除並執行不會再出現在新的點擊位置(就像在Web瀏覽器中多次右鍵單擊一樣)。上下文菜單與每個右鍵單擊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這種行爲?

回答

0

我認爲你不需要在MouseDown事件中寫任何代碼。您只需要做的是 - 在填充TreeView時,正確設置每個NodeContextMenu

如果我是你,我會做這樣的事情

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 
+0

我想我會還需要有代碼在鼠標按下事件來改變節點的焦點上點右鍵。會有這樣的工作嗎? (1).ToString).ContextMenuStrip = test5'。 Im從一個作爲數據表引入的表中填充0級和1級節點。 – Alex

+0

是的,它的工作原理。假設選擇了_Main Node_,並右鍵單擊_Other Level 0 Node_,然後_Other Level 0 Node_將獲得焦點並選中,並且將顯示_ContextMenu_ –

+0

'treeviewMain.Nodes.Add(「CategoryID =」&row.Item (0).ToString,row.Item(1).ToString).ContextMenuStrip = test5'不正確! 您先創建_Node_對象,然後將_ContextMenu_設置爲它,然後添加到_TreeView_。 '昏暗tmpNode作爲新樹節點( 「類別ID =」 &row.Item(0)的ToString,row.Item(1)的ToString())'' = tmpNode.ContextMenuStrip test5' 'treeviewMain.Nodes.Add (tmpNode)' –

相關問題