ContextMenuStrip.Owner属性null从嵌套ToolStripMenuItem检索时

时间:2012-08-23 14:55:37

标签: c# .net winforms contextmenustrip

我有两个ContextMenuStrip的{​​{1}}设置。第二个ToolStripItem有两个额外的嵌套ToolStripItem。我将其定义为:

ToolStripItem

然后我为我想要响应的三个ContextMenuStrip cms = new ContextMenuStrip(); ToolStripMenuItem contextJumpTo = new ToolStripMenuItem(); ToolStripMenuItem contextJumpToHeatmap = new ToolStripMenuItem(); ToolStripMenuItem contextJumpToHeatmapStart = new ToolStripMenuItem(); ToolStripMenuItem contextJumpToHeatmapLast = new ToolStripMenuItem(); cms.Items.AddRange(new ToolStripItem[] { contextJumpTo, contextJumpToHeatmap}); cms.Size = new System.Drawing.Size(176, 148); contextJumpTo.Size = new System.Drawing.Size(175, 22); contextJumpTo.Text = "Jump To (No Heatmapping)"; contextJumpToHeatmap.Size = new System.Drawing.Size(175, 22); contextJumpToHeatmap.Text = "Jump To (With Heatmapping)"; contextJumpToHeatmap.DropDownItems.AddRange(new ToolStripItem[] { contextJumpToHeatmapStart, contextJumpToHeatmapLast }); contextJumpToHeatmapStart.Size = new System.Drawing.Size(165, 22); contextJumpToHeatmapStart.Text = "From Start of File"; contextJumpToHeatmapLast.Size = new System.Drawing.Size(165, 22); contextJumpToHeatmapLast.Text = "From Last Data Point"; 的点击事件设置了一个事件监听器。以下是方法(我只列出了三种方法中的两种):

ToolStripMenuItem

以下是我遇到的问题:

我的void contextJumpTo_Click(object sender, EventArgs e) { // Try to cast the sender to a ToolStripItem ToolStripMenuItem menuItem = sender as ToolStripMenuItem; if (menuItem != null) { // Retrieve the ContextMenuStrip that owns this ToolStripItem ContextMenuStrip owner = menuItem.Owner as ContextMenuStrip; if (owner != null) { // Get the control that is displaying this context menu DataGridView dgv = owner.SourceControl as DataGridView; if (dgv != null) // DO WORK } } } void contextJumpToHeatmapStart_Click(object sender, EventArgs e) { // Try to cast the sender to a ToolStripItem ToolStripMenuItem menuItem = sender as ToolStripMenuItem; if (menuItem != null) { // Retrieve the ToolStripItem that owns this ToolStripItem ToolStripMenuItem ownerItem = menuItem.OwnerItem as ToolStripMenuItem; if (ownerItem != null) { // Retrieve the ContextMenuStrip that owns this ToolStripItem ContextMenuStrip owner = ownerItem.Owner as ContextMenuStrip; if (owner != null) { // Get the control that is displaying this context menu DataGridView dgv = owner.SourceControl as DataGridView; if (dgv != null) // DO WORK } } } } 方法效果很好。我们一直到我确定哪个contextJumpTo_Click点击来自哪里,我可以继续。但是,DataGridView contextJumpTo不是ToolStripMenuItem上的嵌套菜单项。

但我的ContextMenuStrip方法无效。当我到达我确定contextJumpToHeatmapStart_Click的行时,owner.SourceControl为空,我无法继续。现在我知道这个SourceControl嵌套在ToolStripMenuItem中的另一个ContextMenuStrip下,但为什么我的SourceControl上的ContextMenuStrip属性突然显示为空?

如何为SourceControl的嵌套ToolStripMenuItem获取ContextMenuStrip

1 个答案:

答案 0 :(得分:12)

我认为这是一个错误。

我试图抓取工具条父项列表以获取ContextStripMenu所有者,但是SourceControl属性始终为null。

看起来常见的解决方法是在上下文菜单的开头设置控件:

private Control menuSource;

cms.Opening += cms_Opening;

void cms_Opening(object sender, CancelEventArgs e) {
  menuSource = ((ContextMenuStrip)sender).SourceControl;
}

然后你的代码基本上变成了这个:

DataGridView dgv = menuSource as DataGridView;
if (dgv != null) {
  // do work
}