我是.NET的新手,我不得不编写一个程序,其中有一个TreeView,它有不同类型的节点,每种节点都有不同的ContextMenuStrip,所以我创建了多种ContextMenuStrip然后分配给不同的TreeNode的种类。现在我的问题是,当用户显示上下文菜单时,我应该如何找到导致ContextMenuStrip显示的节点。我尝试使用ContextMenuStrip.SourceControl
,但它返回一个TreeView,它永远不会帮助我,因为我知道我的源是TreeView我想知道视图的哪个节点!我现在应该使用某种打击测试吗?如果是,那么使用键盘显示的ContextMenu呢?
答案 0 :(得分: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;
}