2009-11-04 15 views

Respuesta

32

No hay ninguno en WinForms TreeView. Para citar MSDN para TreeView.AfterSelect:

Este evento no se produce cuando el nodo no está seleccionado. Para detectar esta ocurrencia, maneje el evento Control.MouseUp y pruebe la propiedad TreeNode.IsSelected.

Sí, esto apesta.

+12

Control.MouseUp? Deben estar bromeando. ¿Qué pasa si el árbol está navegando con teclas en lugar del mouse? –

+0

Bueno, vale, apesta, pero siempre puedes extender el control y agregar el evento tú mismo. –

+1

¿Cómo se puede anular la selección de un nodo con el teclado? – SLaks

9

No hay nada de malo con el uso de AfterSelect.

Sin embargo, tenga en cuenta que no se disparará si se borra la selección (si se convierte en SelectedNodenull) En su lugar, puede manejar MouseUp, como se recomienda en el documentation.

+0

Desafortunadamente, cuando maneja 'MouseUp', la propiedad' SelectedNode' de la vista en árbol no se ha actualizado aún. –

2

OK, esta es una pregunta OOOLD, pero el problema realmente me molestó. Hice esta pequeña clase de ayuda - funciona para mí.

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 

Puede agregar otros desencadenantes, p. 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) 

Entonces

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

Esto podría estar en C# ...:) – Pedro77

+0

@ Pedro77 - También podrías traducirlo si quieres usarlo ;-) – InteXX

0

hay ninguno en Windows Forms TreeView. Para citar MSDN para TreeView.AfterSelect:

Este evento no se produce cuando el nodo no está seleccionado. Para detectar esta ocurrencia, maneje el evento Control.MouseUp y pruebe la propiedad TreeNode.IsSelected.

Será mejor que utilice el evento TreeView.NodeMouseClick combinado con AfterSelect. No se llama a AfterSelect cuando selecciona el SelectedNode seleccionado previamente. Así que solo llame a AfterSelect cuando sea necesario, e.Node lo ayudará.

private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e) 
    { 
     if (e.Node == tv.SelectedNode) 
      treeView1_AfterSelect(sender, null); 
    } 
Cuestiones relacionadas