Определите, было ли событие прикреплено к - PullRequest
7 голосов
/ 18 июня 2009

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

Я также открыт для другой рекомендации о том, как сделать это вместо этого. Если я сделаю свой AddHandler в Object1.Load, а Object2 еще не существует, то он никогда не обработает мое событие, даже если я создам его позже. Прямо сейчас, в коде, который запускает событие, я только что прибегнул к выполнению RemoveHandler, а затем AddHandler каждый раз, когда событие вызывается, и тогда я знаю, что присоединю, когда объект наконец существует, но я знаю это дерьмовый метод.

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

Ответы [ 4 ]

22 голосов
/ 21 июня 2012

VB.Net создает специальную частную переменную-член в шаблоне <YourEvent>Event, которую можно использовать для проверки на Ничто.

Public Event MyClick As EventHandler

Private Sub OnMyClick()
    If MyClickEvent IsNot Nothing Then
        RaiseEvent MyClick(Me, New EventArgs())
    Else
        ' No event handler has been set.
        MsgBox("There is no event handler. That makes me sad.")
    End If
End Sub

http://blogs.msdn.com/b/vbteam/archive/2009/09/25/testing-events-for-nothing-null-doug-rothaus.aspx

1 голос
/ 30 января 2013

Согласно ответам здесь: http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/9ec8ff1c-eb9b-4cb3-8960-9cd4b25434f2 (которые, по моему мнению, работают согласно моему тестированию), проверка существующих обработчиков событий выполняется после вызова RaiseEvent. Если вы не хотите вызывать событие и просто должны проверить, не подключены ли какие-либо обработчики, вы можете проверить значение скрытой переменной с именем Event, например:

Public Event Foo As ActionFoo

If FooEvent IsNot Nothing Then...
1 голос
/ 18 июня 2009

Вы также можете просто иметь поле bool, которое вы проверяете перед подключением события.

if not eventHooked then
 addhandler
 eventHooked = true
end if

Также, если вам нужен хороший конвертер c # в vb http://www.tangiblesoftwaresolutions.com/ имеет тот, который может переводить 100 строк на лету или меньше для или переводить проект 1000 строк бесплатно. Более того, вы должны приобрести его, но обычно эти ограничения будут работать нормально. Нет я не пытаюсь их рекламировать: -)

0 голосов
/ 18 июня 2009

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

if (MyButton.Click == null)
{
    MyButton.Click += myEventHandler;
}

(я позволю вам перевести это на VB)

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