Щелчок правой кнопкой мыши C # и управление фокусом - PullRequest
3 голосов
/ 01 ноября 2009

У меня есть форма, к которой пользователи могут добавлять элементы управления, и когда они щелкают правой кнопкой мыши, она вызывает контекстное меню, в котором есть возможность отобразить свойства элемента управления, по которому они щелкнули правой кнопкой мыши. Проблема, с которой я сталкиваюсь, состоит в том, чтобы попытаться решить, как выяснить, на каком элементе управления пользователь щелкает правой кнопкой мыши, поскольку их может быть любое количество, и затем сосредоточить внимание на форме. У кого-нибудь есть хорошие предложения? Должен ли я просто использовать (объект Sender) часть события мыши?

Спасибо.

Ответы [ 2 ]

5 голосов
/ 01 ноября 2009

Мой выбор будет использовать object Sender, самое прямое. Хотя вам нужно выполнить приведение, если вы хотите, чтобы операции выполнялись для определенного типа элемента управления.

UPDATE:

Если у вас есть хорошее соглашение об именах или, по крайней мере, для тех элементов управления форм, которые требуют операций ContextMenu, вот как вы можете это сделать:

Прикрепление события щелчка мыши к конкретным элементам управления, или вы можете написать что-то, что нужно присоединить ко всем элементам управления, итерацией по коллекции Controls формы.

label1.MouseClick += new MouseEventHandler(control_RightMouseClick);
label2.MouseClick += new MouseEventHandler(control_RightMouseClick);
label3.MouseClick += new MouseEventHandler(control_RightMouseClick);

Затем выполнить различные операции или показать другое контекстное меню для разных элементов управления

void control_RightMouseClick(object sender, MouseEventArgs e)
{
    if (e.Button != MouseButtons.Right)
    {
        return;
    }
    if (sender.GetType().IsSubclassOf(typeof(Control)))
    {
        Control formControl = (Control)sender;
        switch (formControl.Name)
        {
            case "label_1":
                //do something
                contextMenuStrip1.Show(formControl, e.Location);
                break;
            case "label_2":
                //do something else
                contextMenuStrip2.Show(formControl, e.Location);
                break;
            case "label_3":
                //do something else
                contextMenuStrip3.Show(formControl, e.Location);
                break;
            case "panel_1":
                //do something else
                break;
            default:
                //do something else or return or show default context menu
                contextMenuStrip_default.Show(formControl, e.Location);
                break;
        }
    }

    return;
}
0 голосов
/ 01 ноября 2009

Вы можете проверить тип элемента управления, который вызывает событие, используя:

if (typeof(sender) == _control1.GetType())
{
     // ...
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...