5

jestem na skraju szaleństwa ...Interakcje pomiędzy dwa formanty użytkownika

W aplikacji Jestem rzeczywiście budynek, mam do czynienia z dwoma dynamicznie dodanych kontroli, które muszą współdziałać ze sobą, ale zmniejszyłem problem do przykładu tak prostego, jak to może być, gdy formanty są ładowane statycznie, i nadal przedstawia ten sam problem: wyjątek NullReferenceException podczas wywoływania delegata. Oto sedno:

sterowania 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 

sterowania 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 

Jeśli mogę umieścić punkt przerwania na linii kontroli2 gdzie jest przypisany delegat kontroli1, mogę kroku przez i obserwuj, jak ustawia się w obiekcie Control1. Jednak po wywołaniu zdarzenia btnButton_Click wartość _delClicked powróciła do Nothing.

Każda pomoc zostanie bardzo doceniona. Dzięki!

Odpowiedz

2

Moje przypuszczenie byłoby, że tracisz kontrolę na odświeżenie strony. Dynamicznie dodana kontrola zostaje utracona na poczcie zwrotnej. Na pewno ponownie utworzysz kontrolę, która robi to samo, ale to nie znaczy, że będziesz w stanie złapać kliknięcie. Ale kontrola nie ma jego stanu oglądania przeniesionego między postbackami.

Zobacz ten article o tym, jak to zabrać

0

umieścić to w Page_Init()

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

masz rację, powinno być w init zamiast obciążenia, ale wciąż ma ten sam rezultat. – Blumer

Powiązane problemy