Триггерное событие TreeView AfterSelect несколько раз - PullRequest
3 голосов
/ 25 апреля 2011

У меня есть элемент управления TreeView.Скажем, у меня есть 5 узлов.При выборе узла я заполняю ListView всеми каталогами под этим SelectedNode.Затем я нажимаю кнопку, которая изменяет элементы ListView.

Итак, когда я снова выбираю Узел в TreeView (тот же, который я выбрал ранее), событие AfterSelect не запускается.И из-за этого мой ListView не обновляется.

Есть идеи, ребята / gals?

Ответы [ 5 ]

2 голосов
/ 29 апреля 2018

Обходной путь - переключить выбранный узел ...

    treeView.NodeMouseClick += delegate(object sender, TreeNodeMouseClickEventArgs e) {
        TreeNode selected = e.Node;

        // If node already selected - unselect, then reselect
        if (selected == treeView.SelectedNode) {
            treeView.SelectedNode = null;
            treeView.SelectedNode = selected;
        }
    };
0 голосов
/ 09 апреля 2019

@ Коди Грей Даже это очень пост, просто как пост и ответ.Я думаю, что если вы свернете и развернете древовидное представление в то же время, когда выберете узел, оно будет работать.коды как ниже

MyTreeview.CollapseAll()
MyTreeview.ExpandAll()
0 голосов
/ 25 апреля 2011

Это невозможно. Событие AfterSelect больше не будет вызываться, потому что выбранный узел уже выбран. Выбор не меняется , поэтому событие не будет инициировано.

Как указывает Ганс в комментарии к исходному вопросу, весьма вероятно, что плохой дизайн пользовательского интерфейса ожидает, что пользователь поймет, что повторное нажатие на уже выбранный узел будет иметь некоторый эффект. Лучшее решение - добавить функциональность «Обновить» в ваше приложение. Обычно это сопоставляется клавише F5 и / или сочетанию клавиш Ctrl + R .

Если вам абсолютно необходимо инициировать какое-либо действие, когда узел перевыбран , вам нужно обработать его на более низком уровне, чем событие AfterSelect. А это означает, что нужно выяснить, на каком узле пользователь щелкнул вручную. Для этого обработайте событие MouseDown и используйте метод HitTest , чтобы определить узел в том месте, где пользователь щелкнул. Это не красиво, и я не рекомендую это, но это сделает работу.

private void myTreeView_MouseDown(object sender, MouseEventArgs e)
{
    TreeViewHitTestInfo info = myTreeView.HitTest(e.X, e.Y);

    // Ensure that the user actually clicked on a node (there are lots of areas
    // over which they could potentially click that do not contain a node)
    if ((info.Node != null) && (info.Node == myTreeView.SelectedNode))
    {
        // The user clicked on the currently-selected node,
        // so refresh the TreeView
        // . . . 
    }
}
0 голосов
/ 12 апреля 2017

Вы можете использовать событие щелчка мыши вместо события выбора

Sub treeView1_NodeMouseClick (отправитель ByVal как объект, ByVal как объект TreeNodeMouseClickEventArgs) Обрабатывает TreeView1.NodeMouseClick

    ' textBox1.Text = e.Node.Text
    If Not e.Node.Tag Is Nothing Then
        Dim frm As Form = DirectCast(e.Node.Tag, Form)
        frm.ShowDialog()
        ''frm.Dispose()

    End If

End Sub
0 голосов
/ 25 апреля 2011

Это не стрельба, потому что предмет уже выбран. Вместо этого обработайте MouseDown или PreviewMouseDown.

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