2016-02-13 63 views
2

我正在寻找一种在VB.net中实现TreeView的好方法,它的contextMenuStrip基于表单中不同对象的状态而变体。根据不同对象的状态更改contextMenuStrip

具体来说,在下面的'TreeView'中,当对象状态= 1时显示项目上的contextMenuStrip1,当state = 2时显示项目上的contextMenuStrip2。

到目前为止,我一直在实现类似下面代码的上下文菜单,并在创建节点时添加contextMenuStrip。

Dim Context1 As ContextMenuStrip = New ContextMenuStrip 
AddHandler Context1.Items.Add("Delete Item").Click, AddressOf DeleteSub 


------------------ 
| + TreeNode1 
| + TreeNode2 
| + TreeNode3 
| |- Item1 
| |- Item2 
| |- Item3 
------------------ 
+0

当菜单打开时,您可以禁用它,取决于它的位置 – Plutonix

+0

是否也可以在contextMenuStrip项目上附加一个数字?说如果我选择了dataGridView的第13行,将“13”附加到字符串。例如“删除项目13”? – Alex

+0

是的,我有一个CMS,填写空白类型的东西 - 你需要设置整个文本,但要避免“删除项目13 15 45 47 1 13 ...” – Plutonix

回答

1

我不知道这是什么对象是确定要使用的菜单,所以我用一个CheckBox

Private Sub chkShow2_CheckedChanged(sender... 
    If chkShow2.Checked Then 
     tv1.ContextMenuStrip = cms2 
    Else 
     tv1.ContextMenuStrip = cms1 
    End If 
End Sub 

如果状态心不是知道,直到此刻正需要的菜单,回复:在这种情况下,使用CheckChange事件 - 如果有问题的对象是类似的东西,你可以在状态发生变化时重新分配ContextMenuStrip /分配菜单中的MouseDown事件为TreeView

If e.Button = Windows.Forms.MouseButtons.Right Then 
    If chkShow2.Checked Then 
     tv1.ContextMenuStrip = cms2 
    Else 
     tv1.ContextMenuStrip = cms1 
    End If 
End If 

您也可以手动显示菜单,而不是将其分配给控件:

Private Sub tv1_MouseDown(sender ... 
    If e.Button = Windows.Forms.MouseButtons.Right Then 
     If chkShow2.Checked Then 
      cms2.Show(tv1, e.Location) 
     Else 
      cms1.Show(tv1, e.Location) 
     End If 
    End If 
End Sub 

Would it also be possible to append a number to the contextMenuStrip item?

是的。您可以在显示之前添加/更改或删除菜单项目。例如,如果您有节点{A, B, C},并且想要实现Move To...项目,则当它在节点B上打开并且项目时,禁用该目标。

+0

TreeView中的项目将成为用户可以添加到dataGridView的'步骤'。每个步骤都将具有可在dataGridView中配置的属性。 dataGridView中的位置,位置,最后一步等将决定上下文菜单,以插入,附加,覆盖等等。 – Alex

+0

我会避免一个完全动态的菜单。例如,使用所有这些条目(追加,插入,替换,上移,下移等)来构建它,然后隐藏或禁用那些不适用的条目。 – Plutonix

+0

我正在查看动态菜单,因为这些函数需要在用户当前选择的dataGridView的行上运行。并且上下文菜单应该显示他们正在应用该操作的“步骤”号码。但确实有意义,可以改变菜单的可见性并将行号附加到最后。 – Alex

相关问题