Menemukan node diklik di bawah menu konteks

Bagaimana saya bisa mengetahui node dalam tree daftar menu konteks telah diaktifkan? Misalnya mengklik kanan node dan memilih opsi dari menu.

Saya dapat't menggunakan TreeViews' SelectedNode properti karena node hanya benar-diklik dan tidak dipilih.

Larutan

Anda dapat menambahkan klik mouse acara untuk TreeView, maka pilih node benar menggunakan GetNodeAt diberikan mouse koordinat yang diberikan oleh MouseEventArgs.

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);
        }
    }
}
Komentar (2)

Berikut ini adalah solusi saya. Menempatkan baris ini ke NodeMouseClick acara TreeView:

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

Saya menemukan standar windows treeview perilaku pemilihan perilaku yang akan cukup mengganggu. Misalnya, jika anda menggunakan Explorer dan klik kanan pada node dan tekan Properties, menyoroti node dan menunjukkan kotak dialog properties untuk node yang anda klik. Tapi ketika anda kembali dari dialog, yang disorot node adalah node sebelumnya dipilih/disorot sebelum anda melakukan klik-kanan. Saya menemukan hal ini menyebabkan masalah kegunaan karena saya selamanya menjadi bingung apakah saya bertindak pada node yang tepat.

Jadi dalam banyak dari kita Gui, kita mengubah pohon yang dipilih node pada klik-kanan sehingga tidak ada kebingungan. Ini mungkin tidak sama sebagai standar iwndos aplikasi seperti Explorer (dan saya cenderung sangat model kami GUI perilaku setelah standar jendela aplikasi untuk usabiltiy alasan), saya percaya bahwa ini satu pengecualian kasus hasil yang jauh lebih bermanfaat pohon.

Berikut adalah beberapa kode yang mengubah pilihan pada klik kanan:

  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 );
           }
        }
     }
  }
Komentar (1)

Menghidupkan kembali pertanyaan ini karena saya menemukan ini menjadi solusi yang jauh lebih baik. Saya menggunakan NodeMouseClick acara bukan.

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

Ini adalah pertanyaan kuno, tapi aku masih menemukan itu berguna. Saya menggunakan kombinasi dari beberapa jawaban di atas, karena aku don't ingin mengklik kanan node untuk menjadi selectedNode. Jika saya memiliki akar node yang dipilih dan ingin menghapus salah satu dari itu's anak-anak, saya don't ingin anak-anak yang dipilih ketika saya menghapus itu (saya juga melakukan beberapa pekerjaan pada selectedNode bahwa saya don't ingin terjadi pada klik-kanan). Berikut ini adalah kontribusi saya:

// 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);
}
Komentar (0)

Mirip dengan Marcus' jawaban, ini adalah solusi yang saya temukan bekerja untuk saya:

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

Anda tidak perlu menampilkan menu konteks diri sendiri jika anda menetapkan ke individu masing-masing node seperti:

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

Kemudian di dalam ContextMenu's acara Pembukaan, TreeView.SelectedNode properti akan mencerminkan simpul benar.

Komentar (0)

Berikut adalah bagaimana saya melakukannya.

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

Jika anda ingin menu konteks akan tergantung pada item yang dipilih anda're langkah terbaik menurut saya adalah menggunakan Jonesinator's kode untuk memilih item diklik. Menu konteks anda isi kemudian dapat tergantung pada item yang dipilih.

Memilih item pertama sebagai lawan hanya menggunakan itu untuk menu konteks memberikan beberapa keuntungan. Yang pertama adalah bahwa pengguna memiliki indikasi visual seperti yang ia diklik dan dengan demikian yang item menu terkait dengan. Yang kedua adalah bahwa cara ini's jauh lebih mudah untuk tetap kompatibel dengan metode lain untuk memunculkan menu konteks (misalnya shortcut keyboard).

Komentar (0)

Pilihan lain anda bisa berjalan dengan lebih untuk memiliki sebuah variabel global yang memiliki node yang dipilih. Anda hanya akan perlu untuk menggunakan TreeNodeMouseClickEventArgs.

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

Sekarang anda memiliki akses ke simpul tersebut dan itu's properties.

Komentar (0)