Взаимодействие двух пользовательских элементов управления - PullRequest
5 голосов
/ 18 июня 2009

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

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

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

Ответы [ 2 ]

2 голосов
/ 18 июня 2009

Полагаю, вы теряете контроль над обратной передачей. Динамически добавленный элемент управления теряется при обратной передаче. Конечно, вы воссоздаете элемент управления, который делает то же самое, но это не значит, что вы сможете перехватить событие click. Но элемент управления не имеет своего состояния просмотра, перенесенного между постбеками.

См. статью о том, как это сделать

0 голосов
/ 18 июня 2009

Поместите это в Page_init ()

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