The System.Web.UI.WebControls.TreeView class offers this event, but the Forms version of TreeView doesn't. What's the equivalent in the Forms world? I'm using AfterSelect but it doesn't seem quite right. Maybe it is in fact what I'm looking for but the documentation is a bit hazy.
4 Answers
There's none in WinForms TreeView. To quote MSDN for TreeView.AfterSelect:
This event does not occur when the node is unselected. To detect this occurrence, handle the Control.MouseUp event and test the TreeNode.IsSelected property.
Yes, this sucks.

- 99,783
- 25
- 219
- 289
-
16Control.MouseUp? They must be kidding. What if the tree is being navigating with keys instead of the mouse? – I. J. Kennedy Nov 04 '09 at 01:13
-
Well, ok, it sucks, but you could always just extend the control and add the event yourself. – Ed S. Nov 04 '09 at 01:26
-
1How can you deselect a node with the keyboard? – SLaks Nov 04 '09 at 01:32
-
That won't deselect a node. It'll unfocus the TreeView, but the selection will remain. – SLaks Nov 04 '09 at 01:46
-
> How can you deselect a node with the keyboard? Press an arrow key. – I. J. Kennedy Nov 04 '09 at 02:19
-
1That will still raise the `AfterSelect` event by selecting another node. – SLaks Nov 04 '09 at 02:53
-
1Setting the `Sorted` property of the `TreeView` to `True` will deselect the `SelectedNode`. If you need this, you can put it in the constructor and not in the `Load` event, as it may unselect the node you have already selected programmatically beforehand. – toddmo Nov 02 '14 at 21:18
There's nothing wrong with using AfterSelect
.
However, note that it won't fire if the selection is cleared (if SelectedNode
becomes null
) Instead, you can handle MouseUp
, as recommended in the documentation.

- 868,454
- 176
- 1,908
- 1,964
-
2Unfortunately when you handle `MouseUp` the tree view's `SelectedNode` property has not been updated yet. – default.kramer Sep 16 '15 at 18:43
OK, this is an OOOLD question, but the problem really annoyed me. I made this little helper class -- it works for me.
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
May add other triggers, e.g. Control.Enter, MouseUp etc. etc.
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)
Then
RaiseEvent SelectedTreeNodeChanged(m_tvw, EventArgs.Empty)
End If
End Sub
Private Sub New(tv As TreeView)
m_tvw = tv
End Sub
End Class
There's none in WinForms TreeView. To quote MSDN for TreeView.AfterSelect:
This event does not occur when the node is unselected. To detect this occurrence, handle the Control.MouseUp event and test the TreeNode.IsSelected property.
You'd better use TreeView.NodeMouseClick event combined with AfterSelect. AfterSelect isn't called when you select the previously selected SelectedNode. So just call AfterSelect when necessary, e.Node helps you.
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node == tv.SelectedNode)
treeView1_AfterSelect(sender, null);
}

- 69
- 1
- 2
- 7