いくつかの異なるリストボックスに割り当てられたContextMenuStrip
があります。 ContextMenuStrip
がいつListBox
をクリックしたかを把握しようとしています。最初に以下のコードを試しましたが、機能していません。 sender
には正しい値がありますが、menuSubmitted
に割り当てようとすると、nullになります。
private void MenuViewDetails_Click(object sender, EventArgs e)
{
ContextMenu menuSubmitted = sender as ContextMenu;
if (menuSubmitted != null)
{
Control sourceControl = menuSubmitted.SourceControl;
}
}
どんな助けも素晴らしいでしょう。ありがとう。
以下の支援を使用して、私はそれを理解しました:
private void MenuViewDetails_Click(object sender, EventArgs e)
{
ToolStripMenuItem menuItem = sender as ToolStripMenuItem;
if (menuItem != null)
{
ContextMenuStrip calendarMenu = menuItem.Owner as ContextMenuStrip;
if (calendarMenu != null)
{
Control controlSelected = calendarMenu.SourceControl;
}
}
}
ContextMenu
の場合:問題は、sender
パラメーターが、コンテキストメニュー自体ではなく、クリックされたコンテキストメニューのitemを指していることです。
ただし、各MenuItem
は GetContextMenu
method を公開し、どのContextMenu
にそのメニュー項目が含まれているかがわかりますので、簡単な修正です。
コードを次のように変更します。
private void MenuViewDetails_Click(object sender, EventArgs e)
{
// Try to cast the sender to a MenuItem
MenuItem menuItem = sender as MenuItem;
if (menuItem != null)
{
// Retrieve the ContextMenu that contains this MenuItem
ContextMenu menu = menuItem.GetContextMenu();
// Get the control that is displaying this context menu
Control sourceControl = menu.SourceControl;
}
}
ContextMenuStrip
の場合:ContextMenuStrip
の代わりにContextMenu
を使用すると、状況がわずかに変わります。 2つのコントロールは互いに関連しておらず、一方のインスタンスを他方のインスタンスにキャストすることはできません。
以前と同様に、クリックされたitemはsender
パラメーターで返されるため、ContextMenuStrip
この個々のメニュー項目を所有しています。 Owner
プロパティ でそれを行います。最後に、 SourceControl
property を使用して、コンテキストメニューを表示しているコントロールを決定します。
次のようにコードを変更します。
private void MenuViewDetails_Click(object sender, EventArgs e)
{
// Try to cast the sender to a ToolStripItem
ToolStripItem menuItem = sender as ToolStripItem;
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
Control sourceControl = owner.SourceControl;
}
}
}
古い投稿ですが、私のような誰かがそれに出くわした場合:
ContextMenuStripの場合、上記は私には機能しませんでしたが、何が機能するかを見つけることになりました。
void DeleteMenu_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
{
ContextMenuStrip menu = sender as ContextMenuStrip;
Control sourceControl = menu.SourceControl;
MessageBox.Show(sourceControl.Name);
}
これにより、予想されるコントロールの名前がわかりました。 ifステートメントを使用して検証などを行うことができます。要点を説明するために投稿しています。
このコードを機能させるのは非常に困難でした。これは私が見つけることができる最も簡単な解決策です:
Control _sourceControl = null;
private void contextMenuStrip_Opened(object sender, EventArgs e)
{
_sourceControl = contextMenuStrip.SourceControl;
}
private void contextMenuItem_Click(object sender, EventArgs e)
{
var menuItem = (ToolStripMenuItem)sender;
_sourceControl.Text = menuItem.Text;
MessageBox.Show(menuItem.Name);
MessageBox.Show(sourceControl.Name);
}