我在页面上有一个用户控件(uc)。 uc公开了一些在父页面的Page_Load()事件上设置的属性,应该在用户控件加载时读取。
在从父页面设置任何属性之前,看起来uc的Page_Load()会触发。
我应该在什么事件中设置uc属性,以便在渲染时可以使用这些属性?
我使用ASP.NET 3.5和C#
在控件的Page_Load中执行:
Page.LoadComplete += delegate { LoadTheControl(); };
我仍然想听听你的想法。
答案 0 :(得分:6)
您可以毫不费力地访问OnPreRender酒店。
答案 1 :(得分:3)
我自己今天下午遇到了这个问题。
我在UserControl上创建了一个名为LoadData()的公共方法,并在设置了数据所依赖的属性后从我的主机页面的Page_Load中调用它。
已添加 - 代码示例
在用户控件中:
public property SomeProp {get, set};
public void LoadData()
{
// do work
}
并在主机页面的Page_Load中
myControl.SomeProp = 1;
myControl.LoadData();
答案 2 :(得分:3)
如果您以声明方式将usercontrol放在页面上,只需在那里设置属性。
<cc1:myUserControl MyProperty="1" />
如果要动态地将控件添加到页面,只需在将控件添加到主机页面的控件集合之前设置属性。在您致电Page.Controls.Add(myUserControl)
之前,控件的所有生命周期事件都不会触发。
如果无法避免你现在所拥有的设置,并且父母必须在Page_Load中执行一些逻辑并且UC已经在那里,那么我会建议David Stratton发布的内容,但根据我的经验这通常标准化为Initialize()
或Init()
。
答案 3 :(得分:1)
那么, 答案都没有帮助我。 但是当手动设置事件InitComplete()的属性时,一切正常。 我的用户控件现在已启用,以便在我之前设置属性后读取属性。
答案 4 :(得分:0)
我遇到过类似的问题: -
我首先动态添加UserControl,然后尝试将值分配给控件的内部控件(用户控件中的文本框)。使用任何事件(如INIT或LOAD),控件会给我一个空引用异常,因为通过单步调试代码,控件尚未创建。
后来我发现只有通过dim语句声明控件时才会出现此问题;
Dim MyControl as new MyUserControl
Me.Panel1.Controls.add(MyControl)
MyControl.SetLabelText("My Name") 'Uses a method to set the label text on load.
另一方面,如果我按如下方式使用控件,它可以正常工作:
Dim MyControl as MyUserControl = LoadControl("MyUserControl.ascx")
Me.Panel1.Controls.add(MyControl)
MyControl.SetLabelText("My Label Text")