Есть ли способ узнать, какой TreeNode щелкают правой кнопкой мыши после того, как один из его элементов ContextMenuStrip щелкается левой кнопкой мыши и изменяется элемент CheckedState? - PullRequest
0 голосов
/ 09 мая 2018

Обновление от 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
            }
        }
    }
}

1 Ответ

0 голосов
/ 10 мая 2018

Часть ответа For a ContextMenuStrip для S.O. вопрос Определите, какой элемент управления ContextMenuStrip использовался почти отвечает на мой вопрос.

В моем случае, однако, я хочу обработать элемент ContextMenuStrip, щелкнув правой кнопкой мыши и получить доступ к элементу ContextMenuStrip CheckState при изменении CheckState, поэтому мой код использует ContextMenuStrip item _CheckStateChanged метод события вместо ContextMenuStrip item _Click метод события. Таким образом, мне нужно привести отправителя к ToolStripMenuItem вместо ToolStripItem. Кроме этого, я использую часть ответа For a ContextMenuStrip от S.O. вопрос Определите, какой элемент управления ContextMenuStrip использовался на в моем методе DocumentActionToolStripMenuItem_CheckStateChanged:

private void DocumentActionToolStripMenuItem_CheckStateChanged(object sender, EventArgs e)
{
    Control treeNodeControl;

    ToolStripMenuItem toolStripMenuItem = (ToolStripMenuItem)sender;

    // if the ToolStripMenuItem item is owned by a ContextMenuStrip ...
    if (toolStripMenuItem.Owner is ContextMenuStrip contextMenuStrip)
    {
        // Get the TreeNode that is displaying this context menu
        treeNodeControl = contextMenuStrip.SourceControl;

        if (toolStripMenuItem.CheckState == CheckState.Checked)
        {
            //Do something with treeNodeControl.SelectedNode treeView node
        }
    }

}
...