C #: Как определить, кто является вызывающим элементом пункта контекстного меню, когда он связан с двумя различными объектами? - PullRequest
4 голосов
/ 10 июня 2009

C #: Как определить, кто вызвал пункт меню контекстного меню, когда он связан с двумя различными объектами?

У меня есть две метки, lblOn и lblOff. Я связываю «одно» контекстное меню с обоими ярлыками, чтобы отказаться от создания двух одинаковых.

Как мне узнать, какой объект метки называется contextmenu.menuitem? Таким образом, нажатый на элемент меню знает, было ли это, что контекстное меню было вызвано меткой lblOn или lblOffline?

Ответы [ 4 ]

15 голосов
/ 10 июня 2009

Проверьте SourceControl свойство ContextMenuStrip.

6 голосов
/ 10 июня 2009

Игнорирование. Еще немного погуглив, я нашел решение + пример кода.

private void deleteToolStripMenuItem_Click(object sender, EventArgs e)
{
    //Make sure the sender is a ToolStripMenuItem
    ToolStripMenuItem myItem = sender as ToolStripMenuItem;
    if (myItem != null)
    {
        //Get the ContextMenuString (owner of the ToolsStripMenuItem)
        ContextMenuStrip theStrip = myItem.Owner as ContextMenuStrip;
        if (theStrip != null)
        {
            //The SourceControl is the control that opened the contextmenustrip.
            //In my case it could be a linkLabel
            LinkLabel linkLabel = theStrip.SourceControl as LinkLabel;
            if (linkLabel == null)
                MessageBox.Show("Invalid item selected.", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            else
            {
                if (MessageBox.Show(string.Format("Are you sure you want to remove BOL {0} from this Job?", linkLabel.Text), "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    linkLabel.Text = Program.NullValue(linkLabel);
                }
            }
        }
    }
}

Источник: http://www.tek -tips.com / viewthread.cfm? QID = 1441041 & страница = 8

2 голосов
/ 15 сентября 2012

Я знаю, что это вопрос от многих лун назад, но я действительно не смог найти простой ответ с кодом ... Я знаю, что SLaks как бы указывал на это, но я думаю, что другим нужен пример кода ...

Я хотел знать, кто вызывал контекстное меню между полем для расширенного текста или надписью. Причина в том, что я хотел только одно контекстное меню и хотел, чтобы кнопка копирования в нем была отключено, если вызывающим абонентом было поле расширенного текста, в котором ничего не выделено.

Вот мой код:

    private void contextMenuStrip1_Opened(object sender, EventArgs e)
    {
        //get the context menu (it holds the caller)
        ContextMenuStrip contextMenu = sender as ContextMenuStrip;
        //get the callers name for testing 
        string controlName = contextMenu.SourceControl.Name;

        //test if it is infact me rich text editor making the call.
        if (controlName == "text_rchtxt")
        {
            //if I have nothing selected... I should not be able to copy
            if (text_rchtxt.SelectedText == "")
                copy_shrtct.Enabled = false; 
        }
        else
        {
            //if I do have something selected or if its another control making the call, enable copying
            copy_shrtct.Enabled = true;
        }
    }
0 голосов
/ 30 сентября 2015

Используйте это:

contextMenuStrip1.SourceControl;
...