MSDN表示在页面生命周期的PreInit事件中创建动态控件。
http://msdn.microsoft.com/en-us/library/ms178472.aspx
为什么?
通过在PreInit事件中创建有什么好处?
我见过开发人员在Page_Load方法中创建动态控件的代码吗?
如果有什么不同?。
此致
答案 0 :(得分:4)
Page_Load
,那么 ViewState
可以正常工作,但如果您需要保留它,那么Load
阶段不在您的位置应该添加这些控件。
在加载ViewState之前,动态控件必须存在于页面的控件层次结构中。加载视图状态 - 初始化之前只有一个阶段。这意味着,如果您希望动态控件保持视图状态,则必须将它们添加到页面的Init
事件中的控件层次结构中。
http://aspnet.4guysfromrolla.com/demos/printPage.aspx?path=/articles/092904-1.aspx
但请注意,您无法访问ViewState
事件中的Init
,因为它尚未加载。因此,如果需要,您需要使用不同的持久性介质来跨回发(如Session)存储变量。
答案 1 :(得分:2)
对于原始海报,这个回复可能会迟到,但我认为这可能对其他人有所帮助。
如果您的应用程序/网站不使用母版页,最好在Page_PreInit事件中创建控件。但是如果您使用母版页并希望在运行时在内容页面上创建控件,则Page_Init是理想的事件。
您还可以在Page_Load上创建控件,但请记住,加载View State后会触发页面加载。
答案 2 :(得分:0)
添 谢谢回复。 我做了一个小实验,我在其中创建并在Page_Load方法中动态添加TextBox控件。
在页面上按钮的Postback单击事件中,我试图获取TextBox的Text属性的值。 当在Page_Load事件中动态添加控件而不是OnPreInt方法时,我能够在Button的click事件中获取值。 我认为即使在Page_Load方法中添加了控件,Text值也会保留在ViewState中。
遵循以下代码:
<div>
<p>
<asp:Label ID="lbl" runat="server" />
</p>
<p>
<asp:PlaceHolder ID="plcHolder" runat="server"></asp:PlaceHolder>
</p>
<p>
<asp:Button ID="btn" runat="server" Text="Click" OnClick="btn_Click" />
</p>
</div>
private void _createTextBox()
{
TextBox textBox = new TextBox();
textBox.ID = "txtBox";
textBox.Width = 250;
textBox.ReadOnly = false;
plcHolder.Controls.Add(textBox);
}
protected void Page_Load(object sender, EventArgs e)
{
_createTextBox();
if (!this.IsPostBack)
{
Control ctrl = plcHolder.FindControl("txtBox");
if (ctrl != null)
{
TextBox txtBox = ctrl as TextBox;
txtBox.Text = DateTime.Now.ToString();
}
}
}
protected void btn_Click(object sender, EventArgs e)
{
Control ctrl = plcHolder.FindControl("txtBox");
if (ctrl != null)
{
TextBox txtBox = ctrl as TextBox;
lbl.Text = txtBox.Text;
}
}
请让我知道这是正确的还是我做错了什么?