Взаимодействие между два потребителски контрола

На ръба съм на лудостта...

В приложението, което всъщност изграждам, имам работа с две динамично добавени контроли, които трябва да си взаимодействат помежду си, но намалих проблема до толкова прост, колкото мога да го направя пример като контролите са статично заредени и все още представлява същия проблем: NullReferenceException при извикване на делегата. Ето същината:

Контрол 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

Контрол 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

Ако поставя точка на прекъсване на реда на Control2, където е присвоен делегатът Control1, мога да премина и да гледам как се задава в обекта Control1. Въпреки това, когато се задейства събитието btnButton_Click, стойността на _delClicked се е върнала обратно към нищо.

Всяка помощ ще бъде високо оценена. Благодаря!


person Blumer    schedule 18.06.2009    source източник


Отговори (2)


Предполагам, че губите контрол върху обратното изпращане. Динамично добавена контрола се губи при обратното изпращане. Разбира се, че създавате отново контрола, която прави същото, но това не означава, че ще можете да уловите събитието за кликване. Но контролата няма своето състояние на изгледи, пренесено между обратното изпращане.

Вижте тази статия за това как да направите това

person rie819    schedule 18.06.2009

Поставете това в Page_init()

Dim delChangeLabel As New ChangeLabel(AddressOf UpdateLabel) 
Me.Control1.UpdateLabel = delChangeLabel
person kemiller2002    schedule 18.06.2009
comment
Прав си, трябва да е в init вместо load, но пак има същия резултат. - person Blumer; 18.06.2009