VB.net中ContextMenuStrip的改变值问题

菖蒲老先生 2017-12-14 07:23:30

前提:
一个treeview如下:
ROOT
nodeA
nodeB

然后ContextMenuStrip中有两个菜单项【edit】和【delete】。

要求:
右击【ROOT】节点时,菜单项【edit】和【delete】的Enabled = False,不可用
右击子节点【nodeA】或【nodeB】时,菜单项【edit】和【delete】的Enabled = True,可用

代码:
contextMenuStrip.Items.Item("edit").Enabled = False
contextMenuStrip.Items.Item("delete").Enabled = False
【ROOT】.ContextMenuStrip = contextMenuStrip

contextMenuStrip.Items.Item("edit").Enabled = True
contextMenuStrip.Items.Item("delete").Enabled = True
【nodeA】.ContextMenuStrip = contextMenuStrip
【nodeB】.ContextMenuStrip = contextMenuStrip

最后效果是【ROOT】节点的两个菜单项也可用了。
原因应该就是 ContextMenuStrip 是引用型对象。

请问如何解决这个问题,有没有类似java中的BeanUtils.copyProperties()方法之类的。
...全文
525 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
FainSheeg 2017-12-15
  • 打赏
  • 举报
回复
引用 4 楼 flagiris 的回复:
[quote=引用 3 楼 yangliu0512 的回复:] 直接设置treeview的contextmenustrip就行了,不用一个节点一个节点的设置 然后添加点击事件代码:

Private Sub TreeView1_NodeMouseClick(sender As Object, e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
        If e.Button = MouseButtons.Right Then
            If e.Node.Text = "ROOT" Then
                ContextMenuStrip1.Items.Item("edit").Enabled = False
            Else
                ContextMenuStrip1.Items.Item("edit").Enabled = True
            End If
        End If
    End Sub
就OK了。
是我设置的时间点不对,应该在NodeMouseClick的时候设置。 要是datagridview之类的应该类似吧。[/quote] 是的,差不多。
菖蒲老先生 2017-12-15
  • 打赏
  • 举报
回复
引用 3 楼 yangliu0512 的回复:
直接设置treeview的contextmenustrip就行了,不用一个节点一个节点的设置 然后添加点击事件代码:

Private Sub TreeView1_NodeMouseClick(sender As Object, e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
        If e.Button = MouseButtons.Right Then
            If e.Node.Text = "ROOT" Then
                ContextMenuStrip1.Items.Item("edit").Enabled = False
            Else
                ContextMenuStrip1.Items.Item("edit").Enabled = True
            End If
        End If
    End Sub
就OK了。
是我设置的时间点不对,应该在NodeMouseClick的时候设置。 要是datagridview之类的应该类似吧。
FainSheeg 2017-12-15
  • 打赏
  • 举报
回复
直接设置treeview的contextmenustrip就行了,不用一个节点一个节点的设置 然后添加点击事件代码:

Private Sub TreeView1_NodeMouseClick(sender As Object, e As TreeNodeMouseClickEventArgs) Handles TreeView1.NodeMouseClick
        If e.Button = MouseButtons.Right Then
            If e.Node.Text = "ROOT" Then
                ContextMenuStrip1.Items.Item("edit").Enabled = False
            Else
                ContextMenuStrip1.Items.Item("edit").Enabled = True
            End If
        End If
    End Sub
就OK了。
菖蒲老先生 2017-12-15
  • 打赏
  • 举报
回复
引用 1 楼 zj_zwl 的回复:
可以这么干: 设置node的tag 在菜单弹出事件中判断node的tag,然后作出不同的设置
引用 1 楼 zj_zwl 的回复:
可以这么干: 设置node的tag 在菜单弹出事件中判断node的tag,然后作出不同的设置
关键还是设置contextMenuStrip对象呀,不可能有几个菜单项就拖几个ContextMenuStrip控件吧, 否则有个节点改了值其他节点是不是也都改变了。最后还是一样的。
zj_zwl 2017-12-14
  • 打赏
  • 举报
回复
可以这么干: 设置node的tag 在菜单弹出事件中判断node的tag,然后作出不同的设置

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧