5

ich am Rande des Wahnsinns bin ...Interaktion zwischen zwei Bedienelemente

In der Anwendung, die ich tatsächlich bauen, ich bin mit zwei dynamisch hinzugefügt Kontrollen zu tun, die miteinander interagieren müssen, aber ich habe das Problem auf ein So-wie-ich-kann-es-Beispiel mit den Steuerelementen reduziert, die statisch geladen werden, und es stellt immer noch das gleiche Problem dar: eine NullReferenceException beim Aufrufen des Delegaten. Hier ist der Kern:

Steuerung 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 

Steuerung 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 

Wenn ich einen Haltepunkt auf der Linie des Control2 setzen, wo die Control1 Delegierten zugewiesen sind, kann ich Schritt durch und beobachten, wie es im Control1-Objekt eingestellt wird. Wenn jedoch das Ereignis "btnButton_Click" ausgelöst wird, ist der Wert von _delClicked auf "Nothing" zurückgesetzt worden.

Jede Hilfe würde sehr geschätzt werden. Vielen Dank!

Antwort

2

Meine Vermutung wäre, dass Sie die Kontrolle über die Postbacks verlieren. Ein dynamisch hinzugefügtes Steuerelement geht auf dem Postback verloren. Sicher, Sie erstellen ein Steuerelement neu, das dasselbe tut, aber das bedeutet nicht, dass Sie das Klickereignis erfassen können. Aber die Kontrolle hat ihren Sichtstatus zwischen den Postbacks nicht übertragen.

Sehen Sie diese article auf, wie über das Tun dieses

0

Setzen Sie dieses in Page_Init()

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

Du hast Recht zu gehen, sollte es statt Last in init sein, aber es hat immer noch das gleiche Ergebnis. – Blumer

Verwandte Themen