Как открывать и вызывать настраиваемые события для пользовательского элемента управления vb.net winforms

Прочтите ЭТО пост. У меня та же проблема, что и в этом посте, но я пытаюсь решить ее на VB.net, а не на C #.

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

Общедоступное настраиваемое событие AddRemoveAttendees как EventHandler

Он расширяется до следующего фрагмента кода.

Public Custom Event AddRemoveAttendees As EventHandler
    AddHandler(ByVal value As EventHandler)

    End AddHandler

    RemoveHandler(ByVal value As EventHandler)

    End RemoveHandler

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)

    End RaiseEvent
End Event

Но я не могу понять, что с этим делать. До сегодняшнего дня я никогда не слышал о заказных мероприятиях.

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

Сет


person Seth Spearman    schedule 03.07.2009    source источник


Ответы (2)


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

Public Custom Event AddRemoveAttendees As EventHandler
    AddHandler(ByVal value As EventHandler)
        AddHandler _theButton.Click, value
    End AddHandler

    RemoveHandler(ByVal value As EventHandler)
        RemoveHandler _theButton.Click, value
    End RemoveHandler

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
        ' no need to do anything in here since you will actually '
        ' not raise this event; it only acts as a "placeholder" for the '
        ' buttons click event '
    End RaiseEvent
End Event

В AddHandler и RemoveHandler вы просто распространяете вызов для присоединения или удаления данного обработчика событий к / из события Click элемента управления.

Чтобы немного расширить использование настраиваемых событий, вот еще один пример реализации настраиваемого события:

Dim _handlers As New List(Of EventHandler)
Public Custom Event AddRemoveAttendees As EventHandler

    AddHandler(ByVal value As EventHandler)
        _handlers.Add(value)
    End AddHandler

    RemoveHandler(ByVal value As EventHandler)
        If _handlers.Contains(value) Then
            _handlers.Remove(value)
        End If
    End RemoveHandler

    RaiseEvent(ByVal sender As Object, ByVal e As System.EventArgs)
        For Each handler As EventHandler In _handlers
            Try
                handler.Invoke(sender, e)
            Catch ex As Exception
                Debug.WriteLine("Exception while invoking event handler: " & ex.ToString())
            End Try
        Next
    End RaiseEvent
End Event

Теперь, как показано выше, он не делает ничего, кроме обычного объявления события:

Public Event AddRemoveAttendees As EventHandler

Он предоставляет аналогичный механизм, позволяющий прикреплять и удалять обработчики событий, а также вызывать событие. Пользовательское событие добавляет дополнительный уровень контроля; вы можете написать код, связанный с добавлением, удалением и возбуждением события, в котором вы можете обеспечить соблюдение правил и немного настроить то, что будет происходить. Например, вы можете захотеть ограничить количество обработчиков событий, прикрепленных к вашему событию. Для этого вы можете изменить раздел AddHandler из приведенного выше примера:

    AddHandler(ByVal value As EventHandler)
        If _handlers.Count < 8 Then
            _handlers.Add(value)
        End If
    End AddHandler

Если вам не нужен такой подробный контроль, я не вижу необходимости объявлять настраиваемые события.

person Fredrik Mörk    schedule 03.07.2009

Если вам нужно то же, что и в другом сообщении, которое вы упомянули, вот эквивалент VB.NET:

Public Custom Event AddRemoveAttendees As EventHandler

    AddHandler(ByVal value As EventHandler)
        AddHandler SaveButton.Click, value
    End AddHandler

    RemoveHandler(ByVal value As EventHandler)
        RemoveHandler SaveButton.Click, value
    End RemoveHandler

End Event

Но я не думаю, что это хорошая идея, потому что параметр sender события будет Button, а не ваш _4 _...

Вместо этого вы можете подписаться на событие Button.Click и инициировать собственное событие (без явных средств доступа)

person Thomas Levesque    schedule 03.07.2009
comment
Спасибо за ваш ответ ... Я поставил отметку об ответе на первый пост за его тщательность, но проголосовал за ваш ответ. Я решил обернуть элемент управления стандартными делегатами и событиями внутри элемента управления, чтобы пользовательский элемент управления генерировал события, а не элемент управления chilc ... согласно вашему предложению. Спасибо. Сет - person Seth Spearman; 05.07.2009