Nice programing

ContextMenuStrip이 사용 된 컨트롤 확인

nicepro 2020. 10. 5. 20:51
반응형

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

반응형