none
Обработка нажатия на раскрытие подуровней узла TreeView RRS feed

  • Вопрос

  • Здравствуйте , подскажите пожалуйста , у меня есть компонент TreeView . Я сделал обработчик события MouseUp.

    Примерно так 

    	private: System::Void treeView1_MouseUp(System::Object^  sender, System::Windows::Forms::MouseEventArgs^  e)			 {				 if (e->Button == System::Windows::Forms::MouseButtons::Left)				 {                            Какой-то код 				 }

    Данный обработчик нужен для нахождения элемента который выбран в структуре данных (которую отображает сам TreeView) .

    Как не обрабатывать событие, если была нажата левая кнопка мыши на раскрытии/скрытии подуровней дерева (Expand/Colapse) ? То обрабатывать нужно только в том случае, если был выбран непосредственно сам узел . 

    Спасибо заранее. 




    • Изменено CROSP 29 октября 2013 г. 15:26
    29 октября 2013 г. 13:21

Ответы

  • Прошу прощения, что то давно не программировал под WinForms, да и дергали на работе. Вам нужно событие AfterSelect. Оно вызывается после смены выбранного элемента.
    • Помечено в качестве ответа CROSP 29 октября 2013 г. 18:41
    29 октября 2013 г. 17:05
    Отвечающий
  • Добрый день.

    Сохраняете в поле предыдущую выбранную ноду. В обработчике события анализируете, изменилась выбранная нода или нет. Если изменилась, то сохраняете выбранную ноду как предыдущую и выполняете обработку.

    Сори, на C++ не пишу, вот пример на C#:

    TreeNode selectedNode = null;
    
    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (treeView1.SelectedNode != selectedNode)
        {
            selectedNode = treeView1.SelectedNode;
            // Произошло изменение выбранной ноды
        }
    }

    • Помечено в качестве ответа CROSP 29 октября 2013 г. 18:41
    29 октября 2013 г. 13:52
    Отвечающий

Все ответы

  • Добрый день.

    Сохраняете в поле предыдущую выбранную ноду. В обработчике события анализируете, изменилась выбранная нода или нет. Если изменилась, то сохраняете выбранную ноду как предыдущую и выполняете обработку.

    Сори, на C++ не пишу, вот пример на C#:

    TreeNode selectedNode = null;
    
    private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        if (treeView1.SelectedNode != selectedNode)
        {
            selectedNode = treeView1.SelectedNode;
            // Произошло изменение выбранной ноды
        }
    }

    • Помечено в качестве ответа CROSP 29 октября 2013 г. 18:41
    29 октября 2013 г. 13:52
    Отвечающий
  • Спасибо большое за ответ , действительно должно бы работать , но у меня почему-то treeView->SelectedNode на этапе NodeClick или MouseUp содержит неопределенное значение (NULL) . Подозреваю что это происходит из-за того, что данные события (прерывания ) происходят раньше чем узел становится "выбранным" . То есть при событии MouseUp я беру текущий узел с помощью 

     Point p = Point(e->X, e->Y);
     TreeNode^ node = treeView1->GetNodeAt(p);
    Подскажите пожалуйста , это так и должно быть что во время данного события нету еще выбранного узла ? 


    • Изменено CROSP 29 октября 2013 г. 15:50
    29 октября 2013 г. 15:49
  • Прошу прощения, что то давно не программировал под WinForms, да и дергали на работе. Вам нужно событие AfterSelect. Оно вызывается после смены выбранного элемента.
    • Помечено в качестве ответа CROSP 29 октября 2013 г. 18:41
    29 октября 2013 г. 17:05
    Отвечающий
  • Спасибо большое .
    29 октября 2013 г. 18:42