いくつかのツリーノードを持つツリービューがあります。ツリーノードを右クリックすると、「項目の削除」などのさまざまなオプションを含むコンテキスト メニューが表示されます。
contextmenu-item の eventHandler で、右クリックされた treenode オブジェクトを取得する簡単な方法はありますか?
いくつかのツリーノードを持つツリービューがあります。ツリーノードを右クリックすると、「項目の削除」などのさまざまなオプションを含むコンテキスト メニューが表示されます。
contextmenu-item の eventHandler で、右クリックされた treenode オブジェクトを取得する簡単な方法はありますか?
私はしばらく前に同様の問題を抱えていました、そして私はこのような解決策を思いつきました
標準のContextMenuStripから派生した独自のmyContextMenuStripクラスを作成します
public class myContextMenuStrip : ContextMenuStrip
{
public TreeNode tn;
public myContextMenuStrip() { }
protected override void OnItemClicked(ToolStripItemClickedEventArgs e)
{
base.OnItemClicked(e);
if (e.ClickedItem.Text == "asd") MessageBox.Show(tn.Text);
}
}
内部では、OnItemClickedメソッドをオーバーライドしています。このメソッドは、特定のmenuItemをクリックするとMessageBoxを表示します。
したがって、マウスの右ボタンでtreeViewアイテムをクリックすると、マウスポインタの下からノードが取得され、myContextMenuStripに渡されます。
private void treeView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
TreeNode tn = treeView1.GetNodeAt(e.Location);
myMenu.tn = tn;
}
}
そして、formLoadで、myContextMenuStripを初期化し、アイテムを追加して、treeViewにバインドします。
private void Form1_Load(object sender, EventArgs e)
{
myMenu = new myContextMenuStrip();
myMenu.Items.Add("asd");
treeView1.ContextMenuStrip = myMenu;
}
私はそれがあまりエレガントな方法ではないことを知っていますが、それは単純で機能します(実装が困難または不可能でさえある可能性があるEventArgs内にtreeNode値を渡すという考えとは対照的に-自分自身を試さず、ほとんど試行せずに辞任しました)。
動作するコード全体、必要なフォームのtreeView:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
public myContextMenuStrip myMenu;
private void treeView1_MouseClick(object sender, MouseEventArgs e)
{
if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
TreeNode tn = treeView1.GetNodeAt(e.Location);
myMenu.tn = tn;
}
}
private void Form1_Load(object sender, EventArgs e)
{
myMenu = new myContextMenuStrip();
myMenu.Items.Add("asd");
treeView1.ContextMenuStrip = myMenu;
}
public class myContextMenuStrip : ContextMenuStrip
{
public TreeNode tn;
public myContextMenuStrip() { }
protected override void OnItemClicked(ToolStripItemClickedEventArgs e)
{
base.OnItemClicked(e);
if (e.ClickedItem.Text == "asd") MessageBox.Show(tn.Text);
}
}
}
}
ノードを(右)クリックすると、それが選択ノードになりませんか?
TreeNode needed = TreeViewX.SelectedNode;
乾杯
もう 1 つのアイデアは、コンテキスト メニューの Tag プロパティをノード オブジェクトに設定し、イベント ハンドラからアクセスすることです。もちろん、これは Tag を他に使用していない場合にのみ機能します。
private void MyTreeView_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
MyContextMenu.Tag = e.Node;
MyContextMenu.Show(this, e.Location);
}
}
private void MyToolStripMenuItem_Click(object sender, EventArgs e)
{
//Get TreeNode from Tag
//Note: Could also get ContextMenu from sender,
//but we already have it, so just access it directly
TreeNode node = MyContextMenu.Tag as TreeNode;
if (node == null)
return;
//Do stuff with node here
}