Mic*_*kus 12 .net c# contextmenustrip winforms
我有ContextMenuStrip两个ToolStripItems 的设置.第二个ToolStripItem有两个额外的嵌套ToolStripItems.我将其定义为:
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";
Run Code Online (Sandbox Code Playgroud)
然后ToolStripMenuItem,我为我要响应的三个s 的点击事件设置了一个事件监听器.以下是方法(我只列出了三种方法中的两种):
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
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我的问题:
我的contextJumpTo_Click方法非常好.我们一直到我确定DataGridView点击来自哪里,我可以继续.该contextJumpTo ToolStripMenuItem然而,没有一个嵌套的菜单上的项目ContextMenuStrip.
但我的方法contextJumpToHeatmapStart_Click不正常.当我到达我确定的行时owner.SourceControl,SourceControl为空,我无法继续.现在我知道这ToolStripMenuItem是嵌套在我的另一个ContextMenuStrip,但为什么SourceControl属性突然出现在我身上ContextMenuStrip呢?
如何获得SourceControl嵌套ToolStripMenuItem的ContextMenuStrip?
Lar*_*ech 12
我相信这是一个错误.
我试图抓取工具条父项列表以获取ContextStripMenu所有者,该工作正常,但SourceControl属性始终为null.
看起来常见的工作是在上下文菜单的开头设置控件:
private Control menuSource;
cms.Opening += cms_Opening;
void cms_Opening(object sender, CancelEventArgs e) {
menuSource = ((ContextMenuStrip)sender).SourceControl;
}
Run Code Online (Sandbox Code Playgroud)
然后你的代码基本上变成了这个:
DataGridView dgv = menuSource as DataGridView;
if (dgv != null) {
// do work
}
Run Code Online (Sandbox Code Playgroud)