使用 ASP.NET 2.0 回调访问从动态创建的控件中获取的数据






3.44/5 (8投票s)
2006年2月19日
1分钟阅读

93219

748
在无需在回发后重新创建控件的情况下,存储和检索从动态创建的控件中输入的数据。
引言
在 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)
}
下载源代码文件以查看功能完整的示例。