La classe System.Web.UI.WebControls.TreeView offre cet événement, contrairement à la version de TreeView sous forme de formulaire. Quel est l'équivalent dans le monde des formulaires? J'utilise AfterSelect mais cela ne semble pas très correct. C'est peut-être ce que je cherche, mais la documentation est un peu floue.
Il n'y en a pas dans WinForms TreeView. Pour citer MSDN pour TreeView.AfterSelect :
Cet événement ne se produit pas lorsque le nœud n'est pas sélectionné. Pour détecter cette occurrence, gérez l'événement Control.MouseUp et testez la propriété TreeNode.IsSelected.
Oui, ça craint.
Il n'y a rien de mal à utiliser AfterSelect
.
Cependant, notez qu'il ne se déclenchera pas si la sélection est effacée (si SelectedNode
devient null
). Vous pouvez plutôt gérer MouseUp
, comme recommandé dans le fichier documentation .
OK, c'est une question OOOLD, mais le problème m'a vraiment ennuyé. J'ai fait cette petite classe d'assistance - ça marche pour moi.
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
Peut ajouter d’autres déclencheurs, par exemple 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)
Ensuite
RaiseEvent SelectedTreeNodeChanged(m_tvw, EventArgs.Empty)
End If
End Sub
Private Sub New(tv As TreeView)
m_tvw = tv
End Sub
End Class
Il n'y en a pas dans WinForms TreeView. Pour citer MSDN pour TreeView.AfterSelect:
Cet événement ne se produit pas lorsque le nœud n'est pas sélectionné. Pour détecter cette occurrence, gérez l'événement Control.MouseUp et testez la propriété TreeNode.IsSelected.
Vous feriez mieux d'utiliser l'événement TreeView.NodeMouseClick combiné à AfterSelect. AfterSelect n'est pas appelé lorsque vous sélectionnez le SelectedNode précédemment sélectionné. Donc, il suffit d'appeler AfterSelect si nécessaire, e.Node vous aide.
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Node == tv.SelectedNode)
treeView1_AfterSelect(sender, null);
}