触发TreeView AfterSelect事件多次

时间:2011-04-25 11:56:40

标签: c# .net winforms treeview

我有一个TreeView控件。假设我有5个节点。在选择节点时,我使用SelectedNode下的所有目录填充ListView。然后,我单击一个Button,它修改ListView项。

因此,当我再次在TreeView中选择Node(我之前选择的那个)时,AfterSelect事件不会触发。因此,我的ListView没有得到更新。

任何想法的家伙/加尔斯?

5 个答案:

答案 0 :(得分:2)

解决方法是切换选定的节点...

    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;
        }
    };

答案 1 :(得分:0)

它没有被触发,因为该项目已被选中。请改为处理MouseDownPreviewMouseDown

答案 2 :(得分:0)

这是不可能的。 AfterSelect事件不会再次引发,因为所选的节点已经已经选中。 选择不会更改,因此不会引发该事件。

正如汉斯在对原始问题的评论中指出的那样,很可能用户设计不好,期望用户意识到再次点击已经选中的节点会产生某种影响。更好的解决方案是为您的应用程序添加“刷新”功能。这通常映射到 F5 键和/或 Ctrl + R 键盘快捷键。

如果在重新选择节点时绝对必须触发某些操作,则需要在低于AfterSelect事件的级别处理它。这意味着要确定用户手动点击的节点。为此,请处理MouseDown event,并使用HitTest method确定用户点击位置的节点。它不漂亮,我也不推荐它,但它会完成工作。

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
        // . . . 
    }
}

答案 3 :(得分:0)

您可以使用鼠标点击事件而不是选择事件后

Sub treeView1_NodeMouseClick(ByVal sender As Object,ByVal e As 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

答案 4 :(得分:0)

@Cody Gray即使这是一个非常多的帖子,就像发布和回答一样。 我认为,如果在选择节点的同时折叠并展开树视图,它将起作用。代码如下

MyTreeview.CollapseAll()
MyTreeview.ExpandAll()