5

estoy en el borde de la locura ...interacción entre dos controles de usuario

En la aplicación de realidad estoy construyendo, estoy tratando con dos controles agregados dinámicamente que deben interactuar entre sí, pero reduje el problema a un ejemplo tan simple como lo puedo hacer con los controles cargados estáticamente, y aún presenta el mismo problema: una NullReferenceException al invocar al delegado. Aquí está el quid:

de control 1

Partial Class Control1 
Inherits System.Web.UI.UserControl 

Private _delClicked As System.Delegate 
Public WriteOnly Property UpdateLabel() As System.Delegate 
    Set(ByVal value As System.Delegate) 
     _delClicked = value 
    End Set 
End Property 

Protected Sub btnButton_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnButton.Click 
    Dim aObj(0) As Object 
    aObj(0) = 1 
    _delClicked.DynamicInvoke(aObj) 
End Sub 
End Class 

de control 2

Partial Class Control2 
Inherits System.Web.UI.UserControl 

Protected WithEvents Control1 As New Control1 
Delegate Sub ChangeLabel(ByVal int As Integer) 

Protected Sub Page_Init(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Init 
    Dim delChangeLabel As New ChangeLabel(AddressOf UpdateLabel) 
    Me.Control1.UpdateLabel = delChangeLabel 
End Sub 

Private Sub UpdateLabel(ByVal int As Integer) 
    lblLabel.Text = "Value is now " & int 
End Sub 
End Class 

Si pongo un punto de interrupción en la línea de Control2 donde se asigna el delegado Control1, puedo paso y ver cómo se establece en el objeto Control1. Sin embargo, cuando se desencadena el evento btnButton_Click, el valor de _delClicked ha vuelto a Nothing.

Cualquier ayuda sería muy apreciada. ¡Gracias!

Respuesta

2

Mi conjetura sería que usted está perdiendo el control sobre la devolución de datos. Un control agregado dinámicamente se pierde en la devolución de datos. Claro que vuelve a crear un control que hace lo mismo, pero eso no significa que va a poder atrapar el evento de clic. Pero el control no tiene su ViewState entre las devoluciones.

ver este article sobre cómo ir haciendo esto

0

Pon esto en Page_Init()

Dim delChangeLabel As New ChangeLabel(AddressOf UpdateLabel) 
Me.Control1.UpdateLabel = delChangeLabel 
+0

Tienes razón, debería ser en init en lugar de la carga, pero todavía tiene el mismo resultado. – Blumer

Cuestiones relacionadas