none
как получить индекс (или имя) Nodes элемента treeView, который вызвал contextMenuStrip? RRS feed

  • Вопрос

  • Здравствуйте,

    Подскажите, пожалуйста.

    Есть элемент treeView1. Каждому элементу Nodes[i] из коллекции Nodes присвоен один и тот же  contextMenuStrip1.

    При нажатии правой кнопкой мыши на любой Node, появляется контекстное меню. 

    Можно ли узнать какой именно Nodes[?] вызвал это событие? 

    (При нажатии правой кнопкой мыши свойство treeView1.SelectedNode не изменяется, а создавать для каждого Nodes[i] свой

    contextMenuStrip не удобно).

    Заранее всем спасибо!

    5 марта 2012 г. 12:22

Ответы

  • AfterSelect не приходит по правому клику (или приходит не всегда). Можно попробовать

            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                selectedNode = e.Node;
            }
    
    он точно вызывается до Opening.
    • Помечено в качестве ответа cornflowers 6 марта 2012 г. 7:03
    5 марта 2012 г. 15:33
  • Да, событие treeView_AfterSelect не вызывается при нажатии правой кнопкой мыши. Однако, оно вызывается сразу после того, как вручную присвоить значение свойству treeView.SelectedNode. Итак, получается:

    //сначала обрабатывается событие treeView_NodeMouseClick, которое возникает при нажатии любой кнопкой мыши на Node

           private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)

            {
                treeView1.SelectedNode = e.Node;                   
            }

    //затем можно (но не обязательно) обработать событие treeView_AfterSelect, которое произойдёт уже при нажатии как левой, так и правой кнопкой мыши

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                  //какие то операции
            }

    //а затем ( в моём случае) я обрабатываю событие выбора пункта контекстного меню, причём , благодаря обработке события treeView1_NodeMouseClick, treeView1.SelectedNode уже равно тому Node, которое вызвало контекстное меню.

    private void toolStripMenuItem2_Click(object sender, EventArgs e)
            {  

                ....

                string SelectedBD = treeView1.SelectedNode.Text;
                connectionString = @"Data Source=.;" + "Initial Catalog= " + SelectedBD + ";Integrated Security=True";
                connection = new SqlConnection(connectionString);
                ....
            } 

    Всем огромнейшее спасибо!!!         

     
    • Помечено в качестве ответа cornflowers 6 марта 2012 г. 7:03
    6 марта 2012 г. 7:03

Все ответы

  • Как я понимаю, речь о WinForms.

    В каком именно событии нужно реагировать? ContextMenuStrip.Opening?

    Например, так:

    TreeNode selectedNode;
    
    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
    {
        selectedNode = e.Node;
    }
    
    private void contextMenuStrip1_Opening(object sender, CancelEventArgs e)
    {
        // здесь используем selectedNode
    
        //contextMenuStrip1.Items.Add(selectedNode.Name);
    }

    5 марта 2012 г. 13:12
  • AfterSelect не приходит по правому клику (или приходит не всегда). Можно попробовать

            private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
            {
                selectedNode = e.Node;
            }
    
    он точно вызывается до Opening.
    • Помечено в качестве ответа cornflowers 6 марта 2012 г. 7:03
    5 марта 2012 г. 15:33
  • Попробуйте получать элемент node и показывать меню так:

    void treeView1MouseUp(object sender, MouseEventArgs e)
    {
        if(e.Button == MouseButtons.Right)
        {
            // Select the clicked node
            treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);
    
            if(treeView1.SelectedNode != null)
            {
                myContextMenuStrip.Show(treeView1, e.Location)
            }
        }
    }


    Для связи [mail]

    5 марта 2012 г. 17:55
  • Да, событие treeView_AfterSelect не вызывается при нажатии правой кнопкой мыши. Однако, оно вызывается сразу после того, как вручную присвоить значение свойству treeView.SelectedNode. Итак, получается:

    //сначала обрабатывается событие treeView_NodeMouseClick, которое возникает при нажатии любой кнопкой мыши на Node

           private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)

            {
                treeView1.SelectedNode = e.Node;                   
            }

    //затем можно (но не обязательно) обработать событие treeView_AfterSelect, которое произойдёт уже при нажатии как левой, так и правой кнопкой мыши

    private void treeView1_AfterSelect(object sender, TreeViewEventArgs e)
            {
                  //какие то операции
            }

    //а затем ( в моём случае) я обрабатываю событие выбора пункта контекстного меню, причём , благодаря обработке события treeView1_NodeMouseClick, treeView1.SelectedNode уже равно тому Node, которое вызвало контекстное меню.

    private void toolStripMenuItem2_Click(object sender, EventArgs e)
            {  

                ....

                string SelectedBD = treeView1.SelectedNode.Text;
                connectionString = @"Data Source=.;" + "Initial Catalog= " + SelectedBD + ";Integrated Security=True";
                connection = new SqlConnection(connectionString);
                ....
            } 

    Всем огромнейшее спасибо!!!         

     
    • Помечено в качестве ответа cornflowers 6 марта 2012 г. 7:03
    6 марта 2012 г. 7:03
  • Странно, сколько ни пробую, у меня событие AfterSelect происходит постоянно по правому клику. Ну, вероятно, есть факторы, влияющие на это, которых в моей системе нет.

    Я вот на что хотел обратить внимание. Событие MouseClick происходит, как понятно из названия, по клику мышкой. А если пользователь будет "гулять" по дереву клавиатурой, и вызовет контекстное меню с клавиатуры, то...

    Я активный кнопкодав, и становится грустно, что во многих приложениях поддержка клавиатуры сделана плохо: многие операции можно сделать только мышкой. Прошу не забывать про нас, вымирающих пользователей киборды :).

    6 марта 2012 г. 13:23
  • Если будет гулять клавиаторой - то SelectedNode и так будет актуальным.

    Обработчик на MouseClick в решении cornflowers выставляет SelectedNode на актуальный еще и для мышистов:

    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        treeView1.SelectedNode = e.Node;                   
    }

    6 марта 2012 г. 13:52