两个用户控件之间的交互

5

我快要疯了...

实际上我正在开发的应用程序中,我需要处理两个动态添加的控件,这些控件需要相互交互,但我已经将问题简化为一个最简单的静态加载的示例,并且仍然出现同样的问题:在调用委托时出现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

Control 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
我的猜测是您在回传(postback)时失去了控制。动态添加的控件在回传时会丢失。您可以重新创建一个做同样事情的控件,但这并不意味着您能够捕获点击事件。但控件在回传之间没有其视图状态(viewstate)。
请参考此文章以了解如何解决此问题:链接

0
将此代码放入 Page_init() 中。
Dim delChangeLabel As New ChangeLabel(AddressOf UpdateLabel) 
Me.Control1.UpdateLabel = delChangeLabel

你说得对,应该在init中而不是load中,但结果仍然相同。 - Blumer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接