ccc9149
未知昵称
采纳率89.7%
2018-06-13 02:20

C#treeview不同节点触发不同的右键菜单

5
已采纳
  private void treeView1_MouseDown(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Right)//判断你点的是不是右键
            {
                Point ClickPoint = new Point(e.X, e.Y);
                TreeNode CurrentNode = treeView1.GetNodeAt(ClickPoint);
                if (CurrentNode != null && true == CurrentNode.Checked)//判断你点的是不是一个节点
                if (CurrentNode != null)
                {
                   switch (CurrentNode.Name)//根据不同节点显示不同的右键菜单,当然你可以让它显示一样的菜单
                    {
                        case "":
                            CurrentNode.ContextMenuStrip = contextMenuStrip1;
                            break;

                        default:
                            break;
                    }
                    treeView1.SelectedNode = CurrentNode;//选中这个节点
                }
            }
        }

如上所示,所有的节点右键菜单都是一样的,我把代码改成如下所示的,好像右键菜单不显示了?不应该是名字叫ImplementationDataTypes显示右键菜单吗?
图片说明

  switch (CurrentNode.Name)//根据不同节点显示不同的右键菜单,当然你可以让它显示一样的菜单

                        case "ImplementationDataTypes":
                            CurrentNode.ContextMenuStrip = contextMenuStrip1;
                            break;

                        default:
                            break;
  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

6条回答

  • qq_23126581 郭老师的小迷弟雅思莫了 3年前
            if (CurrentNode != null)
                {
                   switch (CurrentNode.Text)//根据不同节点显示不同的右键菜单,当然你可以让它显示一样的菜单
                    {
                        case "xxxx1":
                            contextMenuStrip1.Items[0].Visible = false;
                            break;
                                                        case "xxxx2":
                            contextMenuStrip1.Items[1].Visible = false;
                            break;
                                                        case "xxxx3":
                            contextMenuStrip1.Items[2].Visible = false;
                            break;
    
                        default:
                            break;
                                                        //放最后
                                                        CurrentNode.ContextMenuStrip = contextMenuStrip1;
                    }
                    treeView1.SelectedNode = CurrentNode;//选中这个节点
                }
    

    这样你是否更直观点?

    点赞 2 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 3年前

    图片说明

    点赞 1 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 3年前

    修改下

             private void treeView1_MouseDown(object sender, MouseEventArgs e)
            {
                var info = treeView1.HitTest(new Point(e.X, e.Y));
                if (info.Node != null) //做个判断,没有点任何Node的时候不要执行
                {
                    ContextMenuStrip cms = new ContextMenuStrip();
                    cms.Items.Add("name = " + info.Node.Name);
                    cms.Items.Add("text = " + info.Node.Text);
                    cms.Items[0].Click += new EventHandler((s1, e1) => Menu_Click(info.Node));
                    cms.Items[1].Click += new EventHandler((s1, e1) => Menu_Click(info.Node));
                    treeView1.ContextMenuStrip = cms;
                }
            }
    
    点赞 评论 复制链接分享
  • caozhy 回答这么多问题就耍赖把我的积分一笔勾销了 3年前
     using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    
    namespace Q691925
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void treeView1_MouseDown(object sender, MouseEventArgs e)
            {
                var info = treeView1.HitTest(new Point(e.X, e.Y));
                ContextMenuStrip cms = new ContextMenuStrip();
                cms.Items.Add("name = " + info.Node.Name);
                cms.Items.Add("text = " + info.Node.Text);
                cms.Items[0].Click += new EventHandler((s1,e1) => Menu_Click(info.Node));
                cms.Items[1].Click += new EventHandler((s1, e1) => Menu_Click(info.Node));
                treeView1.ContextMenuStrip = cms;
            }
    
            void Menu_Click(TreeNode e)
            {
                MessageBox.Show(e.Text);
            }
        }
    }
    
    
    点赞 评论 复制链接分享
  • qq_23126581 郭老师的小迷弟雅思莫了 3年前

    至于你说的:**根据不同节点显示不同的右键菜单,当然你可以让它显示一样的菜单**这个条件,可以用节点的Node.Level来判断,比如菜单有新增,编辑,修改。当level=0这个是一级节点,=1就是2级节点了,然后通过按钮的显隐来控制按钮功能

    点赞 评论 复制链接分享
  • qq_23126581 郭老师的小迷弟雅思莫了 3年前

    这个是DEV的treelist 绑定右键:
    public static void BindTreeListRightMouse(TreeList tl, PopupMenu pMenu, MouseEventArgs e)
    {
    TreeListHitInfo hi = tl.CalcHitInfo(e.Location);
    if (hi.Node != null && e.Button == MouseButtons.Right)
    {
    //选中节点行
    tl.FocusedNode = hi.Node;
    if (tl.FocusedNode != null)
    {
    //绑定右键
    pMenu.ShowPopup(Control.MousePosition);
    }
    }
    }

                treeview绑定右键:
                private void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    
                    {        
    
                               if (e.Button != MouseButtons.Right) return;  
    
                               if (e.Node.Level == 0) return;        
    
                                TreeNode currentNode = this.productTypeTree.GetNodeAt(new Point(e.X, e.Y));    
    
                               ContextMenuStrip cms = new ContextMenuStrip();      
    
                               if (currentNode != null)   
    
                                   { 
    
                                        this.productTypeTree.SelectedNode = currentNode;   
    
                                    }
    
                      }
    
    点赞 评论 复制链接分享