2009-11-04 4 views

Antwort

32

Es gibt keine in WinForms TreeView. Um MSDN für TreeView.AfterSelect zu zitieren:

Dieses Ereignis tritt nicht auf, wenn der Knoten nicht ausgewählt ist. Um dieses Ereignis zu erkennen, behandeln Sie das Control.MouseUp-Ereignis und testen Sie die TreeNode.IsSelected-Eigenschaft.

Ja, das ist scheiße.

+12

Control.MouseUp? Sie müssen Spaß machen. Was passiert, wenn der Baum mit Tasten anstelle der Maus navigiert? –

+0

Nun, ok, es ist scheiße, aber du könntest immer nur das Steuerelement erweitern und das Ereignis selbst hinzufügen. –

+1

Wie können Sie einen Knoten mit der Tastatur abwählen? – SLaks

9

Es ist nichts falsch mit der Verwendung AfterSelect.

Beachten Sie jedoch, dass es wird nicht ausgelöst, wenn die Auswahl gelöscht wird (wenn SelectedNodenull wird) Stattdessen können Sie MouseUp handhaben, wie sie in der documentation empfohlen.

+0

Leider, wenn Sie 'MouseUp' bearbeiten, wurde die' SelectedNode' Eigenschaft der Baumansicht noch nicht aktualisiert. –

2

OK, das ist eine OOOLD Frage, aber das Problem hat mich wirklich genervt. Ich habe diese kleine Helferklasse gemacht - sie funktioniert für mich.

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 

Fügen Sie möglicherweise weitere Trigger hinzu, z. 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) 

Dann

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

Dies könnte in C# sein ...:) – Pedro77

+0

@ Pedro77 - Du könntest es auch übersetzen, wenn Du es benutzen willst ;-) – InteXX

0

Es gibt keine in WinForms TreeView. Um MSDN für TreeView.AfterSelect zu zitieren:

Dieses Ereignis tritt nicht auf, wenn der Knoten nicht ausgewählt ist. Um dieses Ereignis zu erkennen, behandeln Sie das Control.MouseUp-Ereignis und testen Sie die TreeNode.IsSelected-Eigenschaft.

Verwenden Sie besser das TreeView.NodeMouseClick-Ereignis in Kombination mit AfterSelect. AfterSelect wird nicht aufgerufen, wenn Sie den zuvor ausgewählten SelectedNode auswählen. Rufen Sie einfach AfterSelect an, wenn nötig, e.Node hilft Ihnen dabei.

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