Обработчик событий для UserControl не запускается - PullRequest
3 голосов
/ 19 января 2012

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

Это метод, который я использую для добавления моего UserControl в мое приложение WinForms.

private void addContact(some parameters here)
{
     //This is my usercontrol
     contactsListItem.contactsListItem contact = new contactsListItem.contactsListItem();

    //
    //some codes here
    //

    //Adding an event handler for the click event
    contact.Click += new EventHandler(contact_Click);

    //Adding the UserControl to my application
    flowLayoutPanel_contactsList.Controls.Add(contact);
}

Обработчик события contact_Click(...) должен изменить фон моего UserControl. Я попытался войти в код, чтобы посмотреть, сработает ли обработчик события, и обнаружил, что он не сработает независимо от того, где я нажимаю на UserControl.

.

Я искал в интернете. Я встречал такие термины, как делегат, подписчики и издатели.

Что я должен сделать, чтобы обработчик события для моего UserControl события click активировался?

Ответы [ 2 ]

6 голосов
/ 19 января 2012

Какова структура вашего пользовательского контроля? События кликов не отображаются в WindForms, поэтому, если вы нажимаете на элемент управления ВНУТРИ своего пользовательского элемента управления, последний не будет запускать любое событие Click.

enter image description here

EDIT:

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

child1.Click += new EventHandler(child_Click);
child2.Click += new EventHandler(child_Click);
child3.Click += new EventHandler(child_Click);

и внутри child_Click отключить событие Click:

this.OnClick(e);
0 голосов
/ 19 января 2012

Вы, кажется, на правильном пути, однако не ясно, каков ваш contact здесь. Обычно вы используете делегаты (по существу, указатели на функции) для методов, которые имеют передаваемые аргументы:

if (bDeleteRdClick)
    DeleteRD.Click -= delegate { DeleteRDClick(this.Object); };
DeleteRD.Click += delegate { DeleteRDClick(this.Object); };

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

Для метода, описанного выше, использование EventHandler представляется мне правильным подходом, но, как я утверждаю выше, проверка того, является ли contact правильного типа, не будет пропущена:

if (this.contact.GetType() == typeof(RibbonButton))
{
    RibbonButton Rb = (RibbonButton)contact;
    Rb.Click += new EventHandler(contact_Click);
}

Надеюсь, это поможет.

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