Finden Knoten unter Kontextmenü angeklickt

stimmen
61

Wie kann ich das Kontextmenü aktiviert wurde, welcher Knoten in einer Baumliste herausfinden? Zum Beispiel eines Rechtsklick auf einen Knoten und eine Option aus dem Menü auswählen.

Ich kann nicht die TreeViews verwenden SelectedNodeEigenschaft , da der Knoten nur Rechtsklick und nicht ausgewählt worden.

Veröffentlicht am 05/08/2008 um 17:21
quelle vom benutzer
In anderen Sprachen...                            


9 antworten

stimmen
83

Sie können ein Mausklick-Ereignis die TreeView hinzufügen, dann den richtigen Knoten wählen mit der Maus GetNodeAt angegebenen Koordinaten von dem MouseEventArgs zur Verfügung gestellt.

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);
        }
    }
}
Beantwortet am 05/08/2008 um 17:36
quelle vom benutzer

stimmen
19

Hier ist meine Lösung. Setzen Sie diese Zeile in NodeMouseClick Ereignis des TreeView:

 ((TreeView)sender).SelectedNode = e.Node;
Beantwortet am 09/12/2010 um 00:05
quelle vom benutzer

stimmen
11

Ich finde die Standard-Windows-treeview Verhalten Auswahlverhalten ziemlich ärgerlich zu sein. Zum Beispiel, wenn Sie Explorer und klicken Sie rechts auf einen Knoten verwenden und drücken Sie auf Eigenschaften, hebt er den Knoten und zeigt die Eigenschaften für den Knoten Dialog können angeklickt werden. Aber wenn man aus dem Dialog zurückzukehren, war der markierten Knoten der Knoten zuvor ausgewählten / markierten, bevor Sie die rechte Maustaste haben. Ich finde die Usability-Probleme verursacht, weil ich immer auf bin verwirrt zu werden, ob ich auf dem richtigen Knoten gehandelt.

So in vielen unserer GUIs, ändern wir die ausgewählten Baumknoten auf der rechten Maustaste, so dass es keine Verwirrung. Dies kann nicht das gleiche wie ein Standard iwndos App wie Explorer (und ich sind in der Regel stark unser GUI-Verhalten nach Standardfenster Apps für usabiltiy Gründen Modell), glaube ich, dass dies ein Ausnahmefall in weit mehr nutzbare Bäume führt.

Hier ist ein Code, der die Auswahl während der rechten Maustaste ä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 );
           }
        }
     }
  }
Beantwortet am 11/12/2008 um 22:10
quelle vom benutzer

stimmen
6

Neubelebung diese Frage , weil ich finde das eine viel bessere Lösung zu sein. Ich benutze das NodeMouseClickEreignis statt.

void treeview_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if( e.Button == MouseButtons.Right )
    {
        tree.SelectedNode = e.Node;
    }
}
Beantwortet am 02/01/2013 um 20:41
quelle vom benutzer

stimmen
2

Dies ist eine sehr alte Frage, aber ich fand es immer noch nützlich. Ich verwende eine Kombination aus einigen der Antworten oben, weil ich nicht will der Rechtsklick-Knoten die selectedNode werden. Wenn ich der Wurzelknoten ausgewählt und wollen eine davon löschen Kinder, ich möchte nicht das Kind ausgewählt, wenn ich es löschen (ich auch tue etwas Arbeit auf dem selectedNode, die ich will nicht auf einem rechts- passieren 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);
}
Beantwortet am 06/12/2016 um 19:42
quelle vom benutzer

stimmen
2

Ähnlich wie Marcus' Antwort war dies die Lösung, die ich für mich gearbeitet gefunden:

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

Sie zeigen müssen nicht das Kontextmenü selbst, wenn Sie es auf jeden einzelnen Knoten wie so festgelegt:

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

Dann innerhalb der Eröffnungsveranstaltung des ContextMenu, wird die TreeView.SelectedNode Eigenschaft den richtigen Knoten reflektieren.

Beantwortet am 21/11/2012 um 23:10
quelle vom benutzer

stimmen
0

Eine weitere Option , die Sie laufen könnten ist eine globale Variable zu haben , die den ausgewählten Knoten hat. Sie würden nur die verwenden müssen TreeNodeMouseClickEventArgs.

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

Jetzt haben Sie Zugriff auf diesen Knoten und es ist Eigenschaften.

Beantwortet am 12/12/2016 um 20:30
quelle vom benutzer

stimmen
0

Hier ist, wie ich es tun.

private void treeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
    if (e.Button == System.Windows.Forms.MouseButtons.Right)
        e.Node.TreeView.SelectedNode = e.Node;
}
Beantwortet am 29/05/2014 um 23:11
quelle vom benutzer

stimmen
0

Wenn Sie das Kontextmenü werden abhängig von der gewählten Artikel möchten sind Sie am besten bewegen Ich denke, ist Jonesinator den Code zu verwenden, um den angeklickten Punkt zu wählen. Ihr Kontextmenü Inhalte können dann auf dem ausgewählten Element abhängig sein.

das Element auswählen als erstes gerade im Gegensatz zu ihm für das Kontextmenü gibt ein paar Vorteile. Die erste ist, dass der Benutzer eine visuelle Anzeige hat als zu dem er angeklickt und somit das Element des Menü zugeordnet ist. Die zweite ist, dass diese Art und Weise ist es eine verdammt viel einfacher kompatibel zu halten, mit anderen Methoden der das Kontextmenü aufgerufen wird (zB Tastenkombinationen).

Beantwortet am 08/08/2008 um 15:04
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more