web-dev-qa-db-fra.com

Pourquoi n'y a-t-il pas d'événement SelectedNodeChanged pour Windows.Forms.TreeView?

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.

37
I. J. Kennedy

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.

34
Pavel Minaev

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 .

9
SLaks

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
2
Jens

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);
    }
0
dobragab