多次触发TreeView的AfterSelect事件

3
我有一个TreeView控件,假设里面有5个节点。在选择一个节点后,我会使用所有所选节点下的目录来填充ListView。然后,我会单击一个按钮,修改ListView项。
因此,当我再次选择TreeView中的节点(与我先前选择的相同),AfterSelect事件不会触发。由于这个原因,我的ListView没有被更新。
大家有什么想法吗?

2
期望用户发现点击已选节点会产生影响是一厢情愿的想法。添加一个刷新按钮并实现F5按键。 - Hans Passant
5个回答

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

这是不可能的。 因为已经选择了节点,所以AfterSelect事件不会再次触发。 选择没有改变,因此事件不会被触发。

正如Hans在原问题的评论中指出的那样,期望用户意识到再次单击已经选定的节点会产生某种效果,这是非常糟糕的UI设计。更好的解决方案是向您的应用程序添加“刷新”功能。这通常映射到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
        // . . . 
    }
}

谢谢,这段代码对我很有用。您介意提供在用户使用TAB键浏览UI时的相同情况下的代码吗? - Dumbo

0

它没有触发是因为该项已经被选中。请改用MouseDownPreviewMouseDown来处理。


我知道。难道没有其他方法,我只能在AfterSelect事件中这样做吗? - Dev

0
您可以使用MouseClick事件代替AfterSelect事件:
Sub treeView1_NodeMouseClick(ByVal sender As Object, ByVal e As TreeNodeMouseClickEventArgs) Handles 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

-1

@Cody Gray 尽管这是一个非常全面的帖子,但我只是想发布和回答问题。 我认为如果您在选择节点的同时折叠和展开树形视图,它将起作用。代码如下:

MyTreeview.CollapseAll()
MyTreeview.ExpandAll()

除了这种方法的hackish性质之外,它在多个层面上都会导致可怕的用户体验。首先,界面快速更改时不可避免地会出现闪烁/闪光。其次,它会丢失用户状态。我如何展开/折叠TreeView是我的决定;应用程序应该保持它,而不是毫无意义地扔掉它。 - Cody Gray

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接