ASP.NET 中动态创建控件






3.23/5 (35投票s)
如何在 ASP.NET 页面中动态创建控件。
引言
在 ASP.NET WebForm 中运行时添加控件是一项简单的任务
private void Page_Load(object sender, System.EventArgs e)
{
Button newButton = new Button();
newButton.Text = "New Button";
newButton.ID = "newButton";
newButton.Click += new System.EventHandler(this.newButton_Click);
WebUserControl1 newUserControl =
(WebUserControl1)LoadControl("WebUserControl1.ascx");
newUserControl.ID = "newUserControl";
this.PlaceHolder.Add(newUserControl);
this.PlaceHolder.Add(newButton);
}
问题
现在,让我们再深入一点。如果我们要根据用户的某个操作(例如按钮单击)添加一个新控件怎么办?我们将相同的代码从 Page_Load
移动到 Button_Click
事件,然后…问题就出现了。我们的控件会按预期显示,但只有第一次。任何回发都会将页面重置为其原始状态。动态创建的控件将无法触发任何事件。这里发生了什么?答案很简单。Page
类是无状态的。它在渲染后会被销毁。Page
会根据 aspx 文件中的标签重新创建子控件集合,然后可以处理回发数据并附加事件处理程序(在 OnInit
事件中)。我们刚刚动态创建的控件不存在于 aspx 文件中;Page
对它们一无所知。
解决方案
解决方案也很简单。我们必须在页面生命周期的加载阶段重新创建控件。完成此操作后,每个控件都可以处理其回发数据、检索保存的ViewState、引发事件等。
现在,代码框架将如下所示
private void Page_Load(object sender, System.EventArgs e)
{
RecreatePersistedControls();
}
private void Button_Click(object sender, System.EventArgs e)
{
CreateControl("newControl");
PersistControl("newControl");
}
private void RecreatePersistedControls()
{
// Call CreateControl for each persisted control
}
private void CreateControl(string id)
{
// Create controll with specified id,
// add it to controls collection, attach event handlers
}
private void PersistControl(string id)
{
// Persist specified id (in session for example)
}
下载源代码文件以查看功能完整的示例。