Entwickler-Ecke

WinForms - Context menu im Treeview


SSC streezer - Di 05.08.08 08:39
Titel: Context menu im Treeview
Hallo zusammen,

ich habe einen treeview auf den ich ein context menu anbinden möchte.
soweit funktioniert das auch:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        private void treeFile_MouseUp(object sender, MouseEventArgs e)
        {
            treeFile.ContextMenuStrip = contextMenuNodes;
            treeFile.SelectedNode = treeFile.GetNodeAt(e.X, e.Y);
            if (e.Button == MouseButtons.Right)
            {
                contextMenuNodes.Show(e.X, e.Y);
            }
        }


wenn ich nun rechtsklick auf einen node mache, erscheint oben links das contextmenu - anstatt direkt an dem ort wo man die maustaste gedrückt hat. wenn man den rechten maus button loslässt, erscheint es am richtigen ort...

wie schaffe ich dass das context menu richtig angezeigt wird? nämlich nur einmal und beim mouse Up event...


gruss,
streezer


Christian S. - Di 05.08.08 11:16

Ich würde jedem Node das Kontextmenü zuweisen (myTreeNode.ContextMenu = aContextMenu), dann sollte es automatisch am richtigen Ort erscheinen. Der TreeView sollte dann kein ContextMenu mehr haben, nur noch die Nodes.


SSC streezer - Di 05.08.08 11:48


C#-Quelltext
1:
2:
3:
4:
5:
            if (e.Button == MouseButtons.Right)
            {
                TreeNode tn = e.Node;
                tn.ContextMenuStrip = contextMenuNodes;
            }


du meinst so, ja? dann gibt es ein problem mit der auswhal des nodes - ich muss immer zuerst einen node mit der linken taste auswählen dann kann ich den rechtsklick machen. wenn ich keine selektion vorher mache, wählt er immer automatisch den obersten node aus und die aktionen im kontext menu beziehen sich ja immer auf den ausgewählten node... :s


Christian S. - Di 05.08.08 11:50

Nein! Wenn Du die Nodes anlegst, weist Du ihnen das ContextMenu zu. Und dann brauchst Du selber gar nicht mehr auf die Mausklicks reagieren.


SSC streezer - Di 05.08.08 11:58

user profile iconChristian S. hat folgendes geschrieben:
Nein! Wenn Du die Nodes anlegst, weist Du ihnen das ContextMenu zu. Und dann brauchst Du selber gar nicht mehr auf die Mausklicks reagieren.

aber anscheinend stimmt da was nicht - wenn ich auf einen node rechtsklicke wird er nicht selektiert bzw. ausgewählt - und so kann die methode (z.b. node löschen) nicht ausgeführt werden... :s


SSC streezer - Di 05.08.08 13:10

könnte das ein bug im framework 3.5 sein?


Christian S. - Di 05.08.08 13:59

Ah, nee, da war noch was :idea:

Du musst eine Sache noch im MouseDown-Ereignis des Treeview machen:

C#-Quelltext
1:
treeView1.SelectedNode = treeView1.GetNodeAt(e.Location);                    

Dann ist, wenn das Popup-Menü erscheint, auch das richtige Item selektiert!


SSC streezer - Di 05.08.08 14:36

aaaah super! hat geklappt - aber warum ist das so kompliziert - ich hab das mal viel einfacher gelernt (weiss nur nicht mehr wie xD ) -> oder war das schon immer so?