从contextmenu-item eventHandler获取treenode

Rob*_* V. 3 c# treeview contextmenu

我有几个treenodes的树视图.当我右键单击treenode时,我会得到一个具有不同选项的上下文菜单,例如"删除项目".

有没有一种简单的方法可以在contextmenu-item的eventHandler中获取右键单击的treenode对象?

Thr*_*ent 6

前段时间我有类似的问题,我提出了这样的解决方案

创建自己的myContextMenuStrip类,该类派生自标准的ContextMenuStrip

    public class myContextMenuStrip : ContextMenuStrip
    {
        public TreeNode tn;

        public myContextMenuStrip() { }

        protected override void OnItemClicked(ToolStripItemClickedEventArgs e)
        {
            base.OnItemClicked(e);
            if (e.ClickedItem.Text == "asd") MessageBox.Show(tn.Text);
        }
    }
Run Code Online (Sandbox Code Playgroud)

在你内部覆盖OnItemClicked方法,当你单击特定的menuItem时,它将显示MessageBox.

因此,当您使用鼠标右键单击treeView项时,它将从鼠标指针下检索节点并将其传递给myContextMenuStrip.

    private void treeView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            TreeNode tn = treeView1.GetNodeAt(e.Location);
            myMenu.tn = tn;
        }
    }
Run Code Online (Sandbox Code Playgroud)

在formLoad上,您正在初始化myContextMenuStrip,添加项目并将其绑定到treeView.

    private void Form1_Load(object sender, EventArgs e)
    {
        myMenu = new myContextMenuStrip();
        myMenu.Items.Add("asd");
        treeView1.ContextMenuStrip = myMenu;
    }
Run Code Online (Sandbox Code Playgroud)

我知道这不是很优雅的方式,但它很简单而且有效(与在EventArgs中传递treeNode值的想法相反,这可能很难实现甚至不可能 - 没有尝试自己,很少尝试但是已经辞职).

整个工作代码,需要表单上的treeView:

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 WindowsFormsApplication1
{
public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
    }

    public myContextMenuStrip myMenu;

    private void treeView1_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            TreeNode tn = treeView1.GetNodeAt(e.Location);
            myMenu.tn = tn;
        }
    }

    private void Form1_Load(object sender, EventArgs e)
    {
        myMenu = new myContextMenuStrip();
        myMenu.Items.Add("asd");
        treeView1.ContextMenuStrip = myMenu;
    }

    public class myContextMenuStrip : ContextMenuStrip
    {
        public TreeNode tn;

        public myContextMenuStrip() { }

        protected override void OnItemClicked(ToolStripItemClickedEventArgs e)
        {
            base.OnItemClicked(e);
            if (e.ClickedItem.Text == "asd") MessageBox.Show(tn.Text);
        }
    }
}
}
Run Code Online (Sandbox Code Playgroud)

  • 日Thnx.这可能有用,但Valentijn的解决方案更明显:) (2认同)