Visual Basic.NET - AddressOf

 
Vista:

AddressOf

Publicado por agustin (24 intervenciones) el 06/05/2015 11:23:38
Buenos dias
Soy novato en VB.NET y me gustaría saber si se pueden pasar parámetros con un AddressOf. Por ejemplo:
AddHandler Button.Click, AddressOf Funcion(parametro as string)
He leído que tiene algo que ver con los delegados PERO NO ENTIENDO NADA!
Gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

AddressOf

Publicado por Khristtian (17 intervenciones) el 06/05/2015 20:04:16
si señalaras el fin que buscas, seria mas facil ayudarte.

Muchas cosas pueden hacerse de muchas formas... quizá tengas mas opciones si das el resultado esperado.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AddressOf

Publicado por Agustín (24 intervenciones) el 07/05/2015 10:40:16
Sí, quizás no he detallado en exceso.
Tengo un control de usuario que está formado entre otros por un objeto domainupdown y este control de usuario lo tengo por duplicado en el mismo formulario. Lo que quiero es que al cambiar el item seleccionado en el domainupdown (que está dentro del control de usuario) se realice una determinada acción según sea la interacción con uno u otro control de usuario.
Para ello al cargar el formulario hago lo siguiente:

AddHandler UserControl_1.DomainUpDown1.SelectedItemChanged, AddressOf Calcular
AddHandler UserControl_2.DomainUpDown1.SelectedItemChanged, AddressOf Calcular


Si interactúo en el UserControl_1 cambiando la selección del DomainUpDown debería "Calcular" tomando un determinado valor, mientras que si interactúo en el DomainUpDown del UserControl_2 quisiera que tome otro valor para "Calcular". Por mi desconocimiento en este tema lo primero que pienso, aunque ya he visto que no tiene sentido, es:

b]AddHandler UserControl_1.DomainUpDown1.SelectedItemChanged, AddressOf Calcular(Valor1)
AddHandler UserControl_2.DomainUpDown1.SelectedItemChanged, AddressOf Calcular(Valor2)[/b]

dónde Calcular sería un procedimiento del tipo Private Sub Calcular (ByVal Valor as string)

Espero haberme explicado
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 481
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

AddressOf

Publicado por Miguel (476 intervenciones) el 07/05/2015 16:45:51
Hola Agustín,
Para usar el "AdHandler" se necesita que sean compatibles los eventos con las funciones. Para solucionarlo creo que podrías hacer ésto:


1
2
AddHandler UserControl_1.DomainUpDown1.SelectedItemChanged, AddressOf UserControlX_SelectedItemChanged
AddHandler UserControl_2.DomainUpDown1.SelectedItemChanged, AddressOf UserControlX_SelectedItemChanged


1
2
3
4
5
6
7
8
Private Sub UserControlX_SelectedItemChanged(sender As Object, e As EventArgs)
   If (sender.Tag= "UC1") Then 'La propiedad 'Tag' solamente es como ejemplo, aquí obtienes cuál de los controles fue el que generó el evento, no sé si se puede "igualar" (If (sender=UserControl_1) Then).
      Calcular(Valor1)
   End If
   If (sender.Tag= "UC2") Then
      Calcular(Valor2)
   End If
End Sub

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AddressOf

Publicado por Agustín (24 intervenciones) el 07/05/2015 17:02:39
Hola Miguel
Gracias por tu respuesta. Esta opción ya la había probado y aunque defina un valor distinto para el Tag de cada uno de los DomainUpDown de cada control de usuario, cuando intento acceder a él en el procedimiento (sender.Tag=x) me dice que Tag es Nothing. ¿Sabes a qué se debe?
Gracias de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 481
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

AddressOf

Publicado por Miguel (476 intervenciones) el 07/05/2015 17:11:55
Hola, me parece que tienes que definir el "Tag" para los controles "padres" ("UserControl_1" y "UserControl_2"). Intenta lo anterior y me comentas...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 481
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

AddressOf

Publicado por Miguel (476 intervenciones) el 07/05/2015 17:17:45
Si no funcionara, intenta como te comentaba al principio (If (sender=UserControl_1) Then).

Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AddressOf

Publicado por Agustín (24 intervenciones) el 07/05/2015 18:06:01
Hola
Tanto definiendo el tag en el usercontrol padre (ya lo había probado) como la opción sender=UserControl_1 no me funciona. Tambien he probado sender=UserControl_1.DomainUpdDown y tampoco. Me manda el siguiente error:
El operador '=' no está definido para tipo 'DomainUpDown' ni para tipo 'DomainUpDown'
Gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 481
Bronce
Ha mantenido su posición en Visual Basic.NET (en relación al último mes)
Gráfica de Visual Basic.NET

AddressOf

Publicado por Miguel (476 intervenciones) el 07/05/2015 22:35:13
Hola, utiliza la propiedad "Name" del control, primero obtén y muéstrate en un MsgBox el valor para saber cuál es el control que está generando el evento.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

AddressOf

Publicado por Agustin (24 intervenciones) el 08/05/2015 09:24:26
Hola Miguel
Como bien dices la propiedad "Name" del control hace referencia en ambos casos al mismo objeto "DomainUpDown1" que forma parte de ese control de usuario. Te explico como lo he solucionado:

1- He definido un propiedad llamado "Formato" en el control de usuario padre:
Public Property Formato() As String
Get
Return pFormato
End Get
Set(value As String)
pFormato = value
End Set
End Property

De esta forma puedo asignar propiedades diferentes a cada control de usuario hijo en tiempo de diseño. Es decir la pripiedad "Formato" para el ControlUser1 es "1" y la propiedad "Formato" para el ControlUser2 es "2".

2- En el "Load" del control de usuario padre le asigno un TAG diferente según sea la propiedad "Formato"

Select Case Formato
Case "1"
DomainUpDown1.Tag = "1"
Case "2"
DomainUpDown1.Tag = "2"
End Select

A partir de aquí sí que puedo asignar como me decía el If sender.Tag="1" then ...

Te parece correcto

Gracias por tu ayuda
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar