Событие щелчка для пользовательского элемента управления .Net (Windows Forms)

Это, наверное, очень простой вопрос, но по какой-то причине даже правильный способ поиска ответа в Интернете ускользает от меня ...

Я пытаюсь создать пользовательский элемент управления, состоящий из нескольких меток и индикаторов выполнения. Однако я хочу, чтобы у всего элемента управления было событие «Click», которое возникает независимо от того, какой элемент внутри элемента управления был нажат. Я создал процедуру «HandleClick», которая назначена каждому элементу управления:

    private void HandleClick(object sender, EventArgs e)
    {
        // Call the callback function, if we were asked to
        if (OnClick != null)
        {
            EventArgs ee = new EventArgs();
            OnClick(this, ee);
        }
        else
        {
            MessageBox.Show("OnClick was null!");
        }
    }

OnClick в этом случае - это переменная, определенная на уровне управления:

    public new event EventHandler OnClick;

Теперь это правильно работает только с формой. На одной этикетке он показывает MessageBox, а затем вызывает событие во вложенной форме. Все остальные показывают окно сообщения.

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


person Community    schedule 28.04.2011    source источник
comment
Вы должны зарегистрировать одно и то же событие щелчка для каждого из элементов управления. Затем вы также вызываете это событие при щелчке пользовательского элемента управления.   -  person Security Hound    schedule 28.04.2011
comment
Если вам интересно, это сообщение помогло решить эту проблему: stackoverflow.com/questions/1071579/ По сути, удалите HandleClick и свойство и замените его вместо этого: общедоступное новое событие EventHandler Click {add {base.Click + = value; foreach (элемент управления в элементах управления) {control.Click + = value; }} удалить {base.Click - = значение; foreach (элемент управления в элементах управления) {control.Click - = value; }}}   -  person    schedule 28.04.2011


Ответы (2)


Извините за это - просто поставлю ответ на случай, если кто-то поищет его в Google ...

Если вам интересно, этот пост помог решить эту проблему: User Control Click - Windows Forms… По сути, удалите HandleClick и свойство и замените это вместо этого:

public new event EventHandler Click
{
    add
    {
        base.Click += value;
        foreach (Control control in Controls)
        {
            control.Click += value;
        }
    }
    remove
    {
        base.Click -= value;
        foreach (Control control in Controls)
        { 
            control.Click -= value;
        }
    }
}
person Community    schedule 05.05.2011
comment
Большое спасибо, именно то, что я # ищу. - person Kingpin; 23.11.2011
comment
Вы должны принять этот ответ, чтобы закрыть этот вопрос. - person Mark Hall; 13.03.2012
comment
Спасибо!!! Обратите внимание, что вы должны включить рекурсивное добавление / удаление элементов управления, которые находятся внутри элементов управления (например, элементы управления внутри панели) - person Gerhard Powell; 01.05.2012
comment
@GerhardPowell Отличный момент - в моем случае его не было, поэтому я не рассматривал его, но вам понадобится для панелей с потоком и т. Д. - person ; 11.06.2012

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

person Jim Mischel    schedule 28.04.2011
comment
Мне нравится эта идея, но у меня все еще есть проблема, что она работает только тогда, когда щелкают базовый пользовательский элемент управления, а не щелкают элементы управления на нем, если вы понимаете, что я имею в виду - поэтому, добавив панель, я возможно, у вас есть только один большой элемент управления, на который нельзя щелкнуть мышью ... - person ; 28.04.2011