12

私はContextMenuStrip2つのsでセットアップしていますToolStripItem。2 番目ToolStripItemには、ネストされた が 2 つ追加されてい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次に、応答する3 つの のクリック イベントのイベント リスナーをセットアップします。方法は次のとおりです (3 つの方法のうち 2 つだけをリストしました)。

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.SourceControlSourceControlは null であり、先に進むことができません。ToolStripMenuItemこれで、これが my の別の 1 つの下にネストされていることがわかりましContextMenuStripたが、なぜ my のSourceControlプロパティが突然 null になるのContextMenuStripでしょうか?

SourceControlネストされた for aToolStripMenuItemを取得するにはどうすればよいContextMenuStripですか?

4

1 に答える 1

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
}
于 2012-08-23T17:13:25.487 に答える