ContextMenuStrip이 사용 된 컨트롤 확인
나는 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
매개 변수 가 컨텍스트 메뉴 자체가 아니라 클릭 된 컨텍스트 메뉴 의 항목 을 가리키는 것입니다.
그러나 각각 MenuItem
은 해당 메뉴 항목 을 포함 하는 GetContextMenu
메서드 를 표시 하기 때문에 간단한 수정 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
. 두 컨트롤은 서로 관련이 없으며 하나의 인스턴스를 다른 하나의 인스턴스로 캐스팅 할 수 없습니다.
이전과 마찬가지로 클릭 한 항목 은 여전히 sender
매개 변수에 반환 ContextMenuStrip
되므로이 개별 메뉴 항목을 소유 하는을 결정해야 합니다. 당신은 Owner
속성으로 그렇게합니다 . 마지막으로이 SourceControl
속성 을 사용 하여 상황에 맞는 메뉴를 표시하는 컨트롤을 확인합니다.
다음과 같이 코드를 수정하십시오.
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);
}
This gave me the expected control's name. You can put in validation etc with if statements, I'm just posting to get to the point.
I had great difficulty getting any of this code to work. This is the simplest solution I could find:
For A ContextMenuStrip:
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);
}
참고URL : https://stackoverflow.com/questions/4886327/determine-what-control-the-contextmenustrip-was-used-on
'Nice programing' 카테고리의 다른 글
일반 프로토콜을 변수 유형으로 사용하는 방법 (0) | 2020.10.05 |
---|---|
Java에서 객체를 null에 할당하면 가비지 수집에 영향을 줍니까? (0) | 2020.10.05 |
JavaScript로 SVG의 Z 인덱스 / 레이어를 변경할 수 있습니까? (0) | 2020.10.04 |
코드에서 바인딩을 설정하는 방법은 무엇입니까? (0) | 2020.10.04 |
버튼의 드로어 블을 축소하려면 어떻게해야합니까? (0) | 2020.10.04 |