动态控件——清除容器中所有控件的替代选项

本文关键字:控件 选项 清除 动态控件 | 更新日期: 2023-09-27 17:53:08

我正在做一些动态控件的测试。下面的代码是:

ASPX页

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" 
            onselectedindexchanged="DropDownList1_SelectedIndexChanged">
            <asp:ListItem Value="0">Nothing</asp:ListItem>
            <asp:ListItem Value="1">Two buttons</asp:ListItem>
        </asp:DropDownList>
        <asp:Panel ID="Panel1" runat="server">
        </asp:Panel>
    </div>
    </form>
</body>
</html>

背后的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (ViewState["CreateDynamicButton"] != null)
        {
            CreateControls();
        }
    }
    protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        CreateControls();
    }
    void Button_Click(object sender, EventArgs e)
    {
        Button b = (Button)sender;
        Response.Write("You clicked the button with ID " + b.ID);
    }
    private void CreateControls()
    {
        if (DropDownList1.SelectedValue.Equals("1"))
        {
            Panel1.Controls.Clear();
            Button b1 = new Button();
            b1.ID = "b1";
            b1.Text = "Button 1";
            Button b2 = new Button();
            b2.ID = "b2";
            b2.Text = "Button 2";
            b1.Click += new EventHandler(Button_Click);
            b2.Click += new EventHandler(Button_Click);
            Panel1.Controls.Add(b1);
            Panel1.Controls.Add(b2);
            ViewState["CreateDynamicButton"] = true;
        }
    }
}

这段代码可以工作,但正如你所看到的,我在添加按钮之前删除了Panel1.Controls中的所有控件,因为当我选择第二次创建它们时,我得到了重复控件ID的异常。

我认为,对于两个按钮的操作是非常快的,但与大量的控制细化时间将更长。你能建议我一个更好的方法来重新生成控件后,PostBack没有这个解决方案?

动态控件——清除容器中所有控件的替代选项

对于初学者来说,如果您试图永久删除控件(在本例中为按钮),那么您最好使用Dispose方法吗?清除控件面板不会清除它,这就解释了已经在使用的ID。无论面板中有多少个控件,都可以通过一个简单的循环来实现;

foreach(Control control in Container)
{
  control.Dispose();
}

创建按钮时,我看到你把它们命名为btn1 btn2等等。你也可以在循环中这样做;

for(int i = 0; i >= yourInt; i++)
{
  Button b = new Button();
  b.ID = "b" + i;
  b.Text = "Button " + i;
}

}

创建一个类变量private bool ControlsCreated = false;CreateControls方法中,检查

if (!ControlsCreated) {
    //your code to create controls
}

这确保控件只创建一次。如果在以后的任何时候你需要重新创建控件(下拉列表值改变),只需清除容器并将ControlsCreated设置为false。