2009-11-04 54 views

回答

32

WinForms TreeView中没有。要引用MSDN的TreeView.AfterSelect

当节点未被选中时,不会发生此事件。要检测这种情况,请处理Control.MouseUp事件并测试TreeNode.IsSelected属性。

是的,这很糟糕。

+12

Control.MouseUp?他们一定在开玩笑。如果树正在用键而不是鼠标导航? – 2009-11-04 01:13:46

+0

好吧,好吧,它很糟糕,但是你总是可以扩展控制并自己添加事件。 – 2009-11-04 01:26:19

+1

如何用键盘取消选择节点? – SLaks 2009-11-04 01:32:46

9

使用AfterSelect没有任何问题。

但请注意,如果选择被清除,将不会触发(如果SelectedNode成为null)相反,你可以处理MouseUp,如documentation建议。

+0

不幸的是,当你处理'MouseUp'时,树视图的'SelectedNode'属性还没有被更新。 – 2015-09-16 18:43:20

2

好的,这是一个OOOLD问题,但问题真的让我很烦恼。 我做了这个小帮手类 - 它适用于我。

Public Class TreeViewSelectedNodeChangeEventHandler 
Public Event SelectedTreeNodeChanged(sender As Object, e As EventArgs) 

Private m_selectedNode As TreeNode 
Private WithEvents m_tvw As TreeView 

Public Shared Function FromTree(tree As TreeView) As TreeViewSelectedNodeChangeEventHandler 
    If Not IsNothing(tree) Then 
     Return New TreeViewSelectedNodeChangeEventHandler(tree) 
    End If 
    Return Nothing 
End Function 

''' <summary>Assigns 'Value' to 'this' and returns 'Value'.</summary> 
Private Function InLineAssign(Of V)(ByRef this As V, value As V) As V 
    Dim ret = value 
    this = value 
    Return ret 
End Function 

可能会添加其他触发器,例如, Control.Enter,的MouseUp等等,等等

Private Sub keyUp(sender As Object, e As KeyEventArgs) Handles m_tvw.KeyUp 
    If Not Me.m_selectedNode Is InLineAssign(Me.m_selectedNode, m_tvw.SelectedNode) 

然后

RaiseEvent SelectedTreeNodeChanged(m_tvw, EventArgs.Empty) 
     End If 
    End Sub 
    Private Sub New(tv As TreeView) 
     m_tvw = tv 
    End Sub 
End Class 
+2

这可能在C#中...:) – Pedro77 2014-06-20 13:04:31

+0

@ Pedro77 - 你也可以翻译它,如果你想使用它;-) – InteXX 2015-02-07 00:32:55

0

有没有在的WinForms TreeView控件。引用MSDN的TreeView.AfterSelect:

当该节点未被选中时,不会发生此事件。要检测这种情况,请处理Control.MouseUp事件并测试TreeNode.IsSelected属性。

您最好使用TreeView.NodeMouseClick事件与AfterSelect相结合。当您选择之前选择的SelectedNode时,不会调用AfterSelect。所以只需在必要时调用AfterSelect,e.Node就可以帮助你。

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     if (e.Node == tv.SelectedNode) 
      treeView1_AfterSelect(sender, null); 
    } 
相关问题