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

Я на грани безумия...

В приложении, которое я на самом деле создаю, я имею дело с двумя динамически добавляемыми элементами управления, которые должны взаимодействовать друг с другом, но я сократил проблему до максимально простого примера. с элементами управления, загружаемыми статически, и по-прежнему возникает та же проблема: исключение 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 возвращается к Nothing.

Любая помощь будет принята с благодарностью. Спасибо!


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