两个用户控件之间的交互

时间:2009-06-18 17:05:07

标签: asp.net vb.net user-controls delegates nullreferenceexception

我正处于疯狂的边缘......

在我正在构建的应用程序中,我正在处理需要相互交互的两个动态添加的控件,但我已经将问题简化为一个简单的我可以制作的-it控件被静态加载的例子,它仍然存在同样的问题:调用委托时出现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

如果我在分配了Control1委托的Control2的行上放置一个断点,我可以单步执行并观察它在Control1对象中的设置。但是,当btnButton_Click事件触发时,_delClicked的值已经回到Nothing。

非常感谢任何帮助。谢谢!

2 个答案:

答案 0 :(得分:2)

我的猜测是你正在失去对回发的控制权。动态添加的控件会在回发中丢失。当然你重新创建一个控件来做同样的事情,但这并不意味着你将能够捕获点击事件。但是控件没有在回发之间传递它的视图状态。

请参阅此article了解如何执行此操作

答案 1 :(得分:0)

将它放在Page_init()

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