C#右键单击TreeView节点

Dea*_*der 6 c# treeview winforms

我有一个TreeView父节点:Node0.我加3 subnodes:

Node01
Node02
Node03
Run Code Online (Sandbox Code Playgroud)

我有一个popup menu与每个子节点相关联的.

我的问题:如果我直接右击其中一个子节点,我的弹出窗口就不会显示.所以我必须首先选择子节点,然后右键单击以显示弹出窗口.

  1. 如何更改代码以便直接右键单击特定的子节点打开PopupMenu?
  2. popupMenu OpenMe在列表中只有菜单.单击此菜单时,应该打开一个窗口,这个窗口应该与我单击的子菜单相关联.如何获取右键单击子菜单的事件并使用它显示表单?

编辑:

看看这个

private void modifySettingsToolStripMenuItem_Click(object sender, EventArgs e)
    {
        try
        {
            String s = treeView1.SelectedNode.Text;
            new chartModify(s).ShowDialog();
        }
        catch (Exception er)
        {
            System.Console.WriteLine(">>>" + er.Message);
        }
    }
Run Code Online (Sandbox Code Playgroud)

该行String s = treeView1.SelectedNode.Text;获取所选节点的名称,而不是已右键单击的节点.

所以在这里我必须修改这段代码

private void treeview1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
                MessageBox.Show(e.Node.Name);
        }
Run Code Online (Sandbox Code Playgroud)

我这样修改它:

try
        {
            TreeNodeMouseClickEventArgs ee;
            new chartModify(ee.Node.Name).ShowDialog();
        }
Run Code Online (Sandbox Code Playgroud)

但它不起作用: Error:Use of unassigned local variable 'ee'

编辑#2:最终得到了解决方案

public string s;
private void modifySettingsToolStripMenuItem_Click(object sender, EventArgs e)
        {
            try
            {
                new chartModify(s).ShowDialog();
            }
            catch (Exception er)
            {
                System.Console.WriteLine(">>>" + er.Message);
            }
        }
Run Code Online (Sandbox Code Playgroud)

然后

private void treeview1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (e.Button == MouseButtons.Right)
            {
                s = e.Node.Name;
                menuStrip1.Show();
            }
        }
Run Code Online (Sandbox Code Playgroud)

它有效,
谢谢

Mar*_*all 21

您可以尝试使用NodeMouseClick它使用的事件TreeNodeClickEventArgs来获取按钮和被单击的节点.

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if(e.Button == MouseButtons.Right)
        MessageBox.Show(e.Node.Name);
}
Run Code Online (Sandbox Code Playgroud)

修改代码以显示弹出窗口并创建窗体

public partial class Form1 : Form
{
    string clickedNode;
    MenuItem myMenuItem = new MenuItem("Show Me");
    ContextMenu mnu = new ContextMenu();
    public Form1()
    {
        InitializeComponent();
        mnu.MenuItems.Add(myMenuItem);
        myMenuItem.Click += new EventHandler(myMenuItem_Click);
    }

    void myMenuItem_Click(object sender, EventArgs e)
    {
        Form frm = new Form();
        frm.Text = clickedNode;
        frm.ShowDialog(this);
        clickedNode = "";
    }

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            clickedNode = e.Node.Name;
            mnu.Show(treeView1,e.Location);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)