Frage

Wie kann ich herausfinden, bei welchem ​​Knoten in einer Baumliste das Kontextmenü aktiviert wurde?Klicken Sie beispielsweise mit der rechten Maustaste auf einen Knoten und wählen Sie eine Option aus dem Menü aus.

Ich kann die TreeViews nicht verwenden. SelectedNode Eigenschaft, da der Knoten nur mit der rechten Maustaste angeklickt und nicht ausgewählt wurde.

War es hilfreich?

Lösung

Sie können der TreeView ein Mausklickereignis hinzufügen und dann mithilfe von GetNodeAt anhand der von MouseEventArgs bereitgestellten Mauskoordinaten den richtigen Knoten auswählen.

void treeView1MouseUp(object sender, MouseEventArgs e)
{
    if(e.Button == MouseButtons.Right)
    {
        // Select the clicked node
        treeView1.SelectedNode = treeView1.GetNodeAt(e.X, e.Y);

        if(treeView1.SelectedNode != null)
        {
            myContextMenuStrip.Show(treeView1, e.Location);
        }
    }
}

Andere Tipps

Hier ist meine Lösung.Fügen Sie diese Zeile in das NodeMouseClick-Ereignis der TreeView ein:

 ((TreeView)sender).SelectedNode = e.Node;

Ich finde das Standardverhalten bei der Auswahl des Windows-Treeview-Verhaltens ziemlich nervig.Wenn Sie beispielsweise den Explorer verwenden und mit der rechten Maustaste auf einen Knoten klicken und auf „Eigenschaften“ klicken, wird der Knoten hervorgehoben und das Eigenschaftendialogfeld für den Knoten angezeigt, auf den Sie geklickt haben.Wenn Sie jedoch aus dem Dialog zurückkehren, ist der hervorgehobene Knoten der Knoten, der zuvor ausgewählt/hervorgehoben wurde, bevor Sie mit der rechten Maustaste geklickt haben.Ich stelle fest, dass dies zu Problemen bei der Benutzerfreundlichkeit führt, da ich ständig im Unklaren darüber bin, ob ich auf dem richtigen Knoten gehandelt habe.

Deshalb ändern wir in vielen unserer GUIs den ausgewählten Baumknoten per Rechtsklick, damit keine Verwirrung entsteht.Dies ist möglicherweise nicht dasselbe wie eine Standard-iwndos-App wie Explorer (und ich neige dazu, unser GUI-Verhalten aus Gründen der Benutzerfreundlichkeit stark nach Standard-Fenster-Apps zu modellieren). Ich glaube, dass dieser eine Ausnahmefall zu weitaus nutzbareren Bäumen führt.

Hier ist ein Code, der die Auswahl beim Rechtsklick ändert:

  private void tree_MouseUp(object sender, System.Windows.Forms.MouseEventArgs e)
  {
     // only need to change selected note during right-click - otherwise tree does
     // fine by itself
     if ( e.Button == MouseButtons.Right )
     {         
        Point pt = new Point( e.X, e.Y );
        tree.PointToClient( pt );

        TreeNode Node = tree.GetNodeAt( pt );
        if ( Node != null )
        {
           if ( Node.Bounds.Contains( pt ) )
           {
              tree.SelectedNode = Node;
              ResetContextMenu();
              contextMenuTree.Show( tree, pt );
           }
        }
     }
  }

Ich möchte diese Frage noch einmal stellen, weil ich finde, dass dies eine viel bessere Lösung ist.Ich verwende das NodeMouseClick Veranstaltung statt.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}

Ähnlich wie bei Marcus' Antwort war dies die Lösung, die meiner Meinung nach für mich funktioniert hat:

private void treeView_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        treeView.SelectedNode = treeView.GetNodeAt(e.Location);
    }
}

Sie müssen das Kontextmenü nicht selbst anzeigen, wenn Sie es wie folgt auf jeden einzelnen Knoten einstellen:

TreeNode node = new TreeNode();
node.ContextMenuStrip = contextMenu;

Dann spiegelt die TreeView.SelectedNode-Eigenschaft im Opening-Ereignis des ContextMenu den richtigen Knoten wider.

Dies ist eine sehr alte Frage, aber ich fand sie immer noch nützlich.Ich verwende eine Kombination einiger der oben genannten Antworten, da ich nicht möchte, dass der mit der rechten Maustaste angeklickte Knoten zum ausgewählten Knoten wird.Wenn ich den Stammknoten ausgewählt habe und eines seiner untergeordneten Knoten löschen möchte, möchte ich nicht, dass das untergeordnete Knoten ausgewählt wird, wenn ich es lösche (ich mache auch einige Arbeiten am ausgewählten Knoten, die ich nicht auf der rechten Seite ausführen möchte). klicken).Hier ist mein Beitrag:

// Global Private Variable to hold right-clicked Node
private TreeNode _currentNode = new TreeNode();

// Set Global Variable to the Node that was right-clicked
private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        _currentNode = e.Node;
}

// Do something when the Menu Item is clicked using the _currentNode
private void toolStripMenuItem_Clicked(object sender, EventArgs e)
{
    if (_currentNode != null)
        MessageBox.Show(_currentNode.Text);
}

Wenn Sie möchten, dass das Kontextmenü vom ausgewählten Element abhängt, verwenden Sie meiner Meinung nach am besten den Code von Jonesinator, um das angeklickte Element auszuwählen.Der Inhalt Ihres Kontextmenüs kann dann vom ausgewählten Element abhängig sein.

Es bietet einige Vorteile, das Element zuerst auszuwählen, anstatt es nur für das Kontextmenü zu verwenden.Der erste besteht darin, dass der Benutzer einen visuellen Hinweis darauf erhält, auf was er geklickt hat und somit mit welchem ​​Element das Menü verknüpft ist.Zweitens ist es auf diese Weise viel einfacher, die Kompatibilität mit anderen Methoden zum Aufrufen des Kontextmenüs aufrechtzuerhalten (z. B.Tastatürkürzel).

So mache ich es.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}

Eine weitere Möglichkeit zur Ausführung besteht darin, eine globale Variable zu verwenden, die den ausgewählten Knoten enthält.Sie müssten nur das verwenden TreeNodeMouseClickEventArgs.

public void treeNode_Click(object sender, TreeNodeMouseClickEventArgs e)
{
    _globalVariable = e.Node;
}

Jetzt haben Sie Zugriff auf diesen Knoten und seine Eigenschaften.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top