Событие .NET Treeview NodeMouseClick имеет задержку? - PullRequest
0 голосов
/ 05 ноября 2018

У меня есть этот код:

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
        {
            if (treeView1.SelectedNode.Nodes.Count == 0)
            {
                MessageBox.Show("The node does not have any children.");
            }
        }

При щелчке по узлу treeView, у которого нет дочерних элементов, возникает задержка при запуске события.

Например:

  1. Я щелкаю по родительскому узлу с детьми - MessageBox не запускается
  2. Я нажимаю на дочерний узел без детей - MessageBox не запускается
  3. Я снова нажимаю на дочерний узел без дочерних элементов - окно сообщений запускается
  4. Я нажимаю на родительский узел с дочерними элементами - запускается окно сообщений
  5. Я снова нажимаю на родительский узел с потомками - окно сообщений не запускается.

Во время отладки значение SelectedNode.Count представляется числом от щелчка до него.

Что здесь происходит?

1 Ответ

0 голосов
/ 05 ноября 2018

Ваша проблема связана с тем, что OnNodeMouseClick запускается перед любыми событиями, связанными с выбором (OnBeforeSelect & OnAfterSelect), что означает, что проверяемый вами SelectedNode еще не обновлен.

Если вас интересует только изменение выбора , подпишитесь на BeforeSelect (с возможностью отмены выбора) или AfterSelect , Это также будет обрабатывать изменения выбора с помощью клавиатуры.

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

Чтобы увидеть, что на самом деле происходит в фоновом режиме, вы можете взглянуть на исходный код TreeView, в частности, метод WmNotify . Вы увидите, что NodeMouseClick запускается сообщением Windows NM_CLICK. Затем он выполняет проверку попадания по координате (x, y), по которой щелкают, чтобы найти узел под мышью, и, если он найден, возвращает его вам внутри аргумента TreeNodeMouseClickEventArgs события.

TLDR: при подписке на NodeMouseClick ваш выбор еще не изменился (и, возможно, он не меняется), но вы можете увидеть узел, на который нажали, проверив аргумент события. Работает только при использовании мыши, а не клавиатуры.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...