TreeView + ContextMenu

Norbert Eder

Erfahrenes Mitglied
Hi,

hab da eine kleine Frage, check da was net ganz. Folgende Problemstellung:

Ich hab da ein TreeView, dem eine ContextMenu zugewiesen ist. Nun ist es so, dass das ContextMenu je nach ausgewähltem Node angepasst werden soll, sprich MenuItems sollen deaktiviert bzw. aktiviert werden.

Mein Problem besteht nun darin, dass dies in folgendem Fall nicht funktioniert:

A
AA
AB
AC

Der Fokus liegt auf A. Nun wird eine rechte Maustaste auf AA durchgeführt, das KontextMenu erscheint und als SelectedNode wird immer noch A angeführt. D.h. der User müsste zuerst AA anklicken und dann erst das KontextMenu aufrufen. Kann das irgendwie umgangen werden?

Wäre für sämlichte Hints dankbar.

lG,
Norbert
 
Also wenn ich das richtig verstanden habe, ist Node A selektiert und wenn du jetzt auf Node AA rechtsklickst, popt das KontextMenü für Node A auf anstatt für AA.

Ich würde sagen, dann selektier halt vor dem Aufpopen des Kontextmenüs den Node der rechtsgeklickt wurde.
Also indem du das TreeView Click Event abfängst und ermittelst was angeklickt wurde.
 
Ich habs jetzt so gemacht, dass ich aufgrund der Koordinaten (Methode GetNodeAt oder so ähnlich) im MouseDown die entsprechende Node selektiere, dann funktionierts so wie ich es will.

Danke.
 
Wie genau hast du denn dein Problem letztendlich gelöst?

Habe nämlich genau das selbe Problem mit Contextmenu und TreeView :(

Ich muss genau wissen, auf welchen Node er gerade das Contextmenu aufgeklappt hat, um diesem Node dann ein ChildNode hinzuzufügen!

Quellcode und eine kleine Erklärung wäre nicht schlecht ;)

Vielen Dank!


mfG,
MAN
 
Hi,
Code:
// mousedown event deines treeviews
private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
{
	// position an dem sich die maus befindet
	Point p = new Point(e.X, e.Y); 

	// abfrage ob rechte maustaste gedrueckt wurde
	if(e.Button == MouseButtons.Right) 
	{
		// holt das node an dessen position sich die maus befindet
		TreeNode node = this.treeView1.GetNodeAt(p); 

		// prueft ob ins leere geklickt wurde oder ob sich 
		// tatsaechlich ein node an dieser position befindet
		if(node != null) 
		{
			// laesst dein contextmenu aufpoppen
			this.contextMenu1.Show(this.treeView1, p); 

			// da du das node nun hast, kannst du diesem auch childs hinzufuegen etc.
		}
	}
}
 
Aah, soo geht das ;)

Den Ansatz hatte ich eigentlich schon so ziemlich, nur das mit dem e.X und e.Y hatte ich nicht benutzt.

Ich hab' mit der globalen Eigenschaft MousePosition rumexperimentiert und davon dann die Position des Formulars und des TreeViews abgezogen :rolleyes:

Ich denke einfach viel zu kompliziert *gg*

Also: besten Dank!


mfG,
MAN
 
Zurück