我对 .NET 很陌生,我必须编写一个程序,其中有一个具有不同类型节点的 TreeView,每种节点都有不同的 ContextMenuStrip,所以我创建了多种 ContextMenuStrip,然后分配给不同类型的 TreeNode . 现在我的问题是,当用户显示上下文菜单时,我应该如何找到哪个 TreeNode 是导致 ContextMenuStrip 显示的节点。我尝试使用ContextMenuStrip.SourceControl
但它返回一个 TreeView 并且它从来没有帮助我,因为我知道我的源是 TreeView 我想知道视图的哪个节点!现在我应该使用某种命中测试吗?如果是的话,使用键盘显示的 ContextMenu 呢?
问问题
349 次
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 事件处理程序绑定到一个方法,如下所示:
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 回答