Обновление от 5/10/2018 . orhtej2 предположил, что мой вопрос может быть дубликатом . Определите, какой элемент управления ContextMenuStrip использовался на . Это почти дупл, но мой сценарий имеет одно существенное отличие. Подробности см. В моем измененном вопросе и моем ответе.
Смотрите мой код ниже. Моя цель состоит в том, чтобы более четко определить, какой TreeNode щелкнули правой кнопкой мыши после того, как один из его ContextMenuItems щелкнул левой кнопкой мыши.
Как и сейчас, когда я щелкаю правой кнопкой мыши по одному из двух дочерних узлов, оператор if
в TreeView1_NodeMouseClick
загружает нажатый TreeNode
в глобальный treeViewClickedNode
TreeNode
объект. Затем, когда я щелкаю левой кнопкой мыши по одному из двух contextMenuStripChildNode
ToolStripMenuItem
, запускается метод DocumentActionToolStripMenuItem_CheckStateChanged
. Затем я могу проверить состояние проверки. Если это проверено, я могу сделать что-то с treeViewClickedNode
TreeNode
.
Мой вопрос: есть ли более чистый способ определить, какой TreeNode щелкают правой кнопкой мыши после того, как один из его элементов ContextMenuStrip щелкается левой кнопкой мыши, т.е. есть ли способ избавиться от глобальной переменной treeViewClickedNode
?
Примечание. Единственное, что я сделал в конструкторе, это поместил treeview1
на Form1
, закрепил его на Form1
и установил для treeview1 NodeMouseClick
значение TreeView1_NodeMouseClick
using System;
using System.Windows.Forms;
namespace WindowsFormsApp_Scratch
{
public partial class Form1 : Form
{
TreeNode treeViewClickedNode;
ContextMenu mnu = new ContextMenu();
public Form1()
{
InitializeComponent();
// Create the root node.
TreeNode treeNodeRoot = new TreeNode("Documents");
// Add the root node to the TreeView.
treeView1.Nodes.Add(treeNodeRoot);
//Create and add child 2 nodes each with a two item ContextMenuStrip.
string[] childNodeLabels = { "document1.docx", "document2.docx"};
string[] contextItemLabels = { "Action A", "Action B" };
foreach (String childNodeLabel in childNodeLabels)
{
TreeNode treeNode = treeNodeRoot.Nodes.Add(childNodeLabel);
// Create a ContextMenuStrip for this child node.
ContextMenuStrip contextMenuStripChildNode = new ContextMenuStrip
{
ShowCheckMargin = true,
ShowImageMargin = false
};
foreach (String contextItemLabel in contextItemLabels)
{
//Create a menu item.
ToolStripMenuItem action = new ToolStripMenuItem(contextItemLabel, null, DocumentActionToolStripMenuItem_CheckStateChanged)
{
CheckOnClick = true
};
contextMenuStripChildNode.Items.Add(action);
}
treeNode.ContextMenuStrip = contextMenuStripChildNode;
}
private void TreeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
TreeView t = (TreeView)sender;
//Force the node that was right-clicked to be selected
t.SelectedNode = t.GetNodeAt(e.X, e.Y);
if (e.Button == MouseButtons.Right)
{
treeViewClickedNode = e.Node;
}
}
private void DocumentActionToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
{
ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem)sender;
if (toolStripMenuItem.CheckState == CheckState.Checked)
{
//Do something with treeViewClickedNode object
}
}
}
}