2015-10-14 5 views
1

Мы создаем объекты во время выполнения, поэтому перед запуском кода не известно, с каким объектом он работает. Мы хотим добавить обработчик событий для каждого TextBox, который создается во время выполнения. Но когда мы попробуем AddHandler obj.Leave, AddressOf leaveControl, компилятор не запустит программу, потому что «у объекта нет события, такого как« Оставить ».Добавить EventHandler в объект неизвестного типа?

Есть ли способ добавить обработчик события к объекту неизвестного типа?

Спасибо :)

+0

показать код, в котором вы создаете свои элементы управления. – Ric

+0

Несомненно, несмотря на то, что вы создаете эти объекты во время выполнения, вы будете иметь представление о том, что они будут иметь тип TextBox. Учитывая, что это так, тогда простой, если GetType (obj) возвращает вам type = TextBox, тогда вы можете добавить addhandler, как вы знаете, у вас есть текстовое поле в переменной obj, которое будет иметь событие, которое вы хотите обработать. –

+0

Как эти вещи могут быть неизвестны, если вы их создаете? – Plutonix

ответ

3

VB.NET поддерживает позднее связывание писать динамический код. Это хорошо работает для свойств и методов, но не для событий. Нечетное ограничение, я не знаю технической причины для этого. Короче говоря, он никогда не понадобился в более ранних версиях Basic, где привязка событий была динамической на основе имени метода, я подозреваю, что это имеет какое-то отношение к ключевому слову WithEvents.

Обходной путь достаточно прост, вам нужно использовать Reflection. Как это:

Dim obj As Object = New TextBox 
    Dim evt = obj.GetType().GetEvent("Leave") 
    evt.AddEventHandler(obj, New EventHandler(AddressOf leaveControl)) 
+0

Спасибо всем здесь :) Это решение от Ханса работало для меня прямо сейчас. – Dyrdek

1

Вы знаете, что это текстовое поле, так что брось

AddHandler CTYPE (объект, текстовое поле) .Leave, AddressOf leaveControl

+0

Нет, вы не можете этого сделать, потому что, как он утверждает в своем вопросе, код не знает, что это за объект. Ему нужно проверить, какой тип объекта является первым, а затем добавить соответствующий оператор add handler, если он окажется текстовым. –

+0

Я пробовал его с помощью простого if-clause как 'If TypeOf (obj) TextBox Then [...]', но это не сработало. Если это то, что вы имели в виду. Dom:/ – Dyrdek

+0

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

1

Не видя кода для создания элементов управления, поскольку @Dom предлагает, вы можете проверить тип управляющего элемента, который вы создаете, используя следующие (в качестве примера для просмотра только текстовых полей);

Dim tb As TextBox = TryCast(obj, TextBox) 

If tb IsNot Nothing 
    AddHandler tb.Leave, AddressOf leaveControl 
End If 

Опять же, это всего лишь иллюстрация, не зная, в полной мере того, что вы делаете в первую очередь

+0

Как я уже говорил в другом комментарии он не работает с КРП-п по какой-то причине. Сначала мы создаем «Dim ob As Object», затем он получает такой тип, как «TextBox» (в зависимости от файла XML) с «Activator.CreateInstance (type)». После этого мы хотим добавить обработчик, но даже с if-предложением компилятор не позволяет запускать код. – Dyrdek

+0

Итак, 'TryCast' не сработал для вас? – Ric

+0

Как я могу установить «TextBox» в «TryCast» динамически? Потому что на данный момент я не знаю, является ли это TextBox. Я попробовал «Dim t As Type = TypeOf (obj)» и ввел тип в «TryCast», но по какой-то причине не работал. – Dyrdek

1

То, что вы хотите что-то вдоль этих линий:

If obj.GetType() Is GetType(TextBox) then 
    AddHandler obj.Leave, Address myNewRoutine 
End If 

Обратите внимание, что вы не можете просто это TextBox вам нужно снова использовать GetType.

+0

Класс 'object' не имеет события' Leave' - вам нужно перенести сначала в 'TextBox', но, видимо, это также вызывает проблему. – Ric

+0

good catch @Ric Я должен был добавить приведение после того, как установил, что это объект типа TextBox, чтобы он знал о событии отпуска. Если этот подход не работает, хотя я не знаю, что еще мы можем сделать, чтобы помочь, не видя, что на самом деле вызывает проблему. –

+0

Я знаю, его трудно сказать на самом деле. – Ric