私は.NETに非常に慣れていないため、さまざまな種類のノードを持つTreeViewがあるプログラムを作成する必要がありました。ノードの種類ごとに異なるContextMenuStripがあります。そのため、複数の種類のContextMenuStripを作成し、異なる種類のTreeNodeに割り当てます. ここで私の質問は、ユーザーがコンテキスト メニューを表示するときに、どの TreeNode が ContextMenuStrip を表示するノードであったかをどのように見つけるべきかということです。使用しようとしましContextMenuStrip.SourceControl
たが、TreeView が返され、ビューのどのノードを知りたいのか知りたいのは、ソースが TreeView であることを知っているためです。ある種のヒット テストを使用する必要がありますか? はいの場合、キーボードを使用して表示される ContextMenu はどうですか?
1 に答える
0
Tag プロパティを使用して、ソース ノードを「リンク」することができます。たとえば、フォームの Load イベント ハンドラーでは次のようになります。
private void Form1_Load(object sender, EventArgs e)
{
TreeNode rootNode = treeView1.Nodes[0];
rootNode.Nodes[0].ContextMenuStrip = contextMenuStrip1;
contextMenuStrip1.Tag = rootNode.Nodes[0];
rootNode.Nodes[1].ContextMenuStrip = contextMenuStrip2;
contextMenuStrip2.Tag = rootNode.Nodes[1];
}
次に、以下のように、すべての ContextMenuStrip コントロールの Opened イベント ハンドラーを 1 つのメソッドにバインドできます。
private void contextMenuStrip_Opened(object sender, EventArgs e)
{
ContextMenuStrip cms = sender as ContextMenuStrip;
TreeNode aNode = cms.Tag as TreeNode;
if (aNode != null)
{
MessageBox.Show(aNode.Text);
}
}
もっと良い方法があるかもしれませんが、これで問題を解決できるはずです。
2012 年 10 月 17 日更新:
private void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
contextMenuStrip1.Tag = e.Node;
}
}
private void contextMenuStrip1_Opened(object sender, EventArgs e)
{
ContextMenuStrip cms = sender as ContextMenuStrip;
TreeNode aNode = cms.Tag as TreeNode;
if (aNode == null)
{
aNode = treeView1.SelectedNode;
}
MessageBox.Show(aNode.Text);
}
private void contextMenuStrip1_Closed(object sender, ToolStripDropDownClosedEventArgs e)
{
ContextMenuStrip cms = sender as ContextMenuStrip;
cms.Tag = null;
}
于 2012-10-16T11:03:40.417 に答える