因为用户控件不属于该页面,所以不能直接访问它,除非您直接在包含页面的usercontrol中设置一个属性,或者创建一个循环遍历所有父对象的递归函数直到找到System.Web.UI.Page
类型的对象。
对于第一个,你可以使用属性在用户控件(我使用了一个名为ParentForm
物业这样做):
Private _parentForm as System.Web.UI.Page
Public Property ParentForm() As System.Web.UI.Page ' or the type of your page baseclass
Get
Return _parentForm
End Get
Set
_parentForm = value
End Set
End Property
在“父母”页面,你会设置该属性的尽可能早的事件。我更喜欢使用PreLoad,因为它在加载之前(因此在大多数其他控件需要它时可用)和init之后。
Protected Sub Page_PreLoad(ByVal sender as Object, ByVal e as EventArgs) Handles Me.PreLoad
Me.myUserControlID.ParentForm = Me
End Sub
你也可以编写一个函数通过父控件来控制寻找页面。以下代码未经测试,因此可能需要调整,但这个想法很有道理。
Public Shared Function FindParentPage(ByRef ctrl As Object) As Page
If "System.Web.UI.Page".Equals(ctrl.GetType().FullName, StringComparison.OrdinalIgnoreCase) Then
Return ctrl
Else
Return FindParentPage(ctrl.Parent)
End If
End Function
编辑:您还因为它没有类型System.Web.UI.Page
中存在不能直接访问该属性。正如@Tim Schmelter建议的那样,您可以尝试将页面转换为特定的页面类型_Default
,或者如果这对于许多页面来说都是常见的,则可能需要创建基本页面类并将该属性包含在该类中。然后,你可以在页面继承这个类而不是System.Web.UI.Page
Public Class MyBasePage
Inherits System.Web.UI.Page
Public Property SelectedID() as Integer
...
End Property
End Class
然后:
Partial Class _Default
Inherits MyBasePage
...
End Class
感谢蒂姆,我把你的建议。我添加了一个公共属性到我的控件中,并在我动态添加它时从页面中设置了该属性! – s15199d 2010-11-04 15:06:08