2009-03-24 10 views
2

Ich verwende das Click-Ereignis auf der TreeView, um einige Sachen zu tun, wenn ein Knoten in der TreeView geklickt wird. Ich tue dies, indem Sie den Knoten erhalten, die durch den Aufruf GetNodeAt klicken Sie ist() mit den Mauskoordinaten, wie folgt aus:C# TreeView.GetNodeAt() Problem mit dem Klicken auf Bilder

private void TreeView_Click(object sender, System.EventArgs e) 
{ 
    MouseEventArgs mouseEventArgs = e as MouseEventArgs; 

    if (mouseEventArgs == null) 
     return; 

    // Get the node that is being clicked.     
    TreeNode node = this.GetNodeAt(mouseEventArgs.X, mouseEventArgs.Y); 

    // Do other stuff... 
} 

jedoch die GetNodeAt() Methode funktioniert nur, wenn der Klick auf den Knoten Etikett ist, wenn Das Knotenbild wird angeklickt und GetNodeAt() gibt null zurück. Das ist ein bisschen nervig, da der Knoten tatsächlich ausgewählt wird, wenn auf das Bild geklickt wird, aber ich kann nicht herausfinden, um welchen Knoten es sich handelt.

Hat jemand irgendwelche Vorschläge?

Aktualisiert: Ich habe einige Vorschläge, SelectedNode stattdessen zu verwenden. Ich kann es nicht, da es nach dem Klick-Ereignis ausgelöst wurde. Dies ist tatsächlich in einem Steuerelement, das TreeView erbt, und was es tut, ist feuern sein eigenes Clicked-Ereignis, aber mit den zugrunde liegenden Daten, die der TreeNode anstelle des TreeNode selbst darstellt.

Aktualisiert: Stellt sich heraus, dass jemand die GetNodeAt() -Methode in unserem Code überschrieben hatte, die dieses Verhalten einführte, was ich nicht erkannte. Daher ist die Frage null und nichtig und es gibt kein Problem mit der GetNodeAt() -Methode. Warum jemand das tun würde, bleibt ein Geheimnis. :)

Antwort

4

Haben Sie versucht, die Before oder Afterselect Events? Sie können den ausgewählten Knoten direkt aus TreeViewCancelEventArgs abrufen und ihn dann in Ihrem Click-Ereignis verwenden.

Edit: Weitere Gedanken: Das einzige Problem, das ich mit diesem sehen kann, ist, dass das tatsächlich Before Ereignis nach Event des Click und Mouseclick abfeuert.

Ein anderes Edit: Wenn Sie ein Ereignis benötigen, das vor Klicken ausgelöst wird, können Sie NodeMouseClick verwenden - TreeNodeMouseClickEventArgs hat eine Node-Eigenschaft.

+0

Diese oder SelectedNodeChanged sollten die Ereignisse sein. Es sei denn, Sie möchten nur etwas tun, wenn Sie mit der Maus darauf klicken. Andernfalls kann der Code durch die Tastatur beschädigt werden. – Samuel

+0

Richtig, brauchte eine Weile, um mich selbst herauszufinden, aber Treeview.AfterSelect (oder BeforeSelect) ist wahrscheinlich das, was Sie wollen, anstatt das Click-Ereignis. – Davy8

+0

@ Samuel - BeforeSelect und AfterSelect Feuer sogar auf einer Tastatur Veranstaltung wie Pfeil nach oben. – Moose

2

Warum nicht einfach TreeView.SelectedNode verwenden?

+0

Ich kann nicht, da es festgelegt ist, nachdem das Click-Ereignis ausgelöst wurde. Dies ist tatsächlich in einem Steuerelement, das TreeView erbt, und was es tut, ist feuern sein eigenes Clicked-Ereignis, aber mit den zugrunde liegenden Daten, die der TreeNode anstelle des TreeNode selbst darstellt. – Casper

0

Versuchen:

TreeNode node = this.SelectedNode; 

EDIT: Geschlagen mit dem Stempel von Sean