65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET 中动态创建控件

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.23/5 (35投票s)

2004年8月28日

CPOL

1分钟阅读

viewsIcon

319451

downloadIcon

7333

如何在 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)
}

下载源代码文件以查看功能完整的示例。

© . All rights reserved.