Динамическое добавление и использование типов в vb.net

Я делаю программу, которая динамически добавляет в форму объекты, такие как кнопка или флажок.

Для каждого экземпляра добавляется обработчик, поэтому для события Click каждого объекта вызывается определенная функция.

Теперь, когда вызывается этот обработчик, как я могу манипулировать объектом, вызвавшим событие Click? Объект Sender здесь бесполезен, так как я не могу изменить местоположение, текст, родителя, вообще ничего.

Поскольку объекты создаются динамически, имя их экземпляра, к сожалению, всегда будет одинаковым, поэтому я не могу просто делать такие вещи, как button1.Text = "Button 1".

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

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

Спасибо за помощь!


person Cyclone    schedule 15.10.2009    source источник
comment
winforms, но najmeddine это уже получил. В любом случае спасибо Джоэл!   -  person Cyclone    schedule 16.10.2009


Ответы (3)


Приведите отправителя к Control, и вы можете делать, что хотите (все ваши объекты являются элементами управления, верно?)

person manji    schedule 15.10.2009
comment
Я пытался привести прямо к типу объекта, это не сработало, лол. Спасибо, я даже не знал, что вообще существует тип управления, лол.... - person Cyclone; 16.10.2009

Похоже, отправитель — это то, что вам нужно, поскольку это будет объект, который вызвал событие Click. Вам просто нужно найти способ привести его к нужному типу.

Если вы просто манипулируете местоположением, текстом и родителем, то приведения к Control будет достаточно:

Dim c As Control = CType(sender, Control)

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

Другой вариант — включить позднее связывание, которое, как мне кажется, в VB — это Option Strict Off. Затем вы можете обращаться к управляющим свойствам даже без приведения — .NET будет искать свойство во время выполнения (и, будьте осторожны, выдаст исключение, если свойства там нет).

person itowlson    schedule 15.10.2009
comment
Я бы использовал TryCast(), а не CType, но +1 для приведения к управлению - person Joel Coehoorn; 16.10.2009

Если вы знаете тип ввода, который вызвал обработчик, вы можете использовать приведение типов для решения вашей проблемы:

Sub General_OnClick(ByVal sender As Object, ByVal e As EventArgs)
    Dim b As Button = sender
    b.Text = "Hello World!"
End Sub

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

Sub General_OnClick(ByVal sender As Object, ByVal e As EventArgs)
    If TypeOf sender Is Button Then
        Dim b As Button = sender
        b.Text = "Hello World!"
    Else If TypeOf sender Is TextBox Then
        Dim tb As TextBox = sender
        tb.Text = "Goodbye cruel world!"
    End If
End Sub

EDIT: Обновлено для перевода на VB.Net

person Community    schedule 15.10.2009
comment
Спасибо большое Даниил. @Cyclone: ​​Прошли годы с тех пор, как я использовал VB.NET, и я рад этому факту. Дело в том, что это лучший способ сделать это, и никто еще не ответил на него таким образом в VB, поэтому я решил, что ответ на C # лучше, чем вообще никакого ответа. - person Matthew Scharley; 16.10.2009
comment
developerfusion.com/tools/convert/csharp-to-vb ;) Я лично люблю VB, поэтому я планирую придерживаться его некоторое время. - person Cyclone; 16.10.2009