//ascx
<%@ Control Language="C#" AutoEventWireup="true" CodeFile="WebUserControl.ascx.cs" Inherits="WebUserControl" %>
<div style="background-color:Red; width:150px; height:200px;">
    <asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
    <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
</div>//ascx.cs
public partial class WebUserControl : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {
        this.Visible = true;
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        this.Visible = false;
        if (Session["OPENED_FOLDER"] != null)
        {
            Hashtable table = (Hashtable)Session["OPENED_FOLDER"];
            table.Remove(TextBox1.Text);
        }
    }    public string Name
    {
        set { this.TextBox1.Text = value; }
    }
}// aspx
<form id="form1" runat="server">
        <asp:ScriptManager ID="ScriptManager1" runat="server" />
        <div>
            &nbsp;<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />
        </div>
        <div id="Contents" runat="server"></div>
    </form>//aspx.cs
public partial class _Default : System.Web.UI.Page 
{
    string[] names = new string[] { "123", "456", "789" };
    static int count = 0;    protected void Page_Load(object sender, EventArgs e)
    {
        if (Session["OPENED_FOLDER"] == null)
        {
            Session["OPENED_FOLDER"] = new Hashtable();
        }
        else
        {
            Hashtable table = (Hashtable)Session["OPENED_FOLDER"];            foreach (DictionaryEntry de in table)
            {
                CreateDisplayFilesFolder(de.Value.ToString());
            }
        }
    }
    protected void Button1_Click(object sender, EventArgs e)
    {
        string name = names[count%3];
        count ++;
        if (Session["OPENED_FOLDER"] != null)
        {
            Hashtable table = (Hashtable)Session["OPENED_FOLDER"];
            if (table[name] == null )
            {
                table[name] = name;
                CreateDisplayFilesFolder(name);
            }
        }
    }    void CreateDisplayFilesFolder(string name)
    {
        WebUserControl ctr = (WebUserControl)Page.LoadControl("WebUserControl.ascx");
        ctr.Name = name;
        Contents.Controls.Add(ctr);
    }
}
以上是我写的代码,可以动态添加控件,但总是有问题,有时候控件的click事件绑定不上,比如点了三次页面上的按钮创建了3个控件,但如果点击最开始创建的那个控件的按钮,可以将它关掉,然后再点击别的控件,有时候就不行,必须要点两次,实在不知道是啥原因。只是看到有时候控件上的按钮无法触发与其绑定的click事件

解决方案 »

  1.   

    不明白问题是什么,ScriptManager 不熟悉,没有看到 Contents 是虾米
    如果不熟悉 asp.net 内在机制的话,如页生命周期,通常应该规避采取动态添加控件的方式,
      

  2.   

    <div id="Contents" runat="server"></div>这个就是contents,如果不明白我可以把源代码发给你,然后你运行一下就知道是什么问题了。其实我就是想实现点击一次按钮,可以动态的增加一个用户控件,然后点击用户控件的按钮,在将这个控件删除。当然是需要可以添加多个控件,这个怎么实现?
      

  3.   

    疑点:你那ascx中的HastTable并没作用上。
      

  4.   

    WebUserControl ctr = (WebUserControl)Page.LoadControl("WebUserControl.ascx");
    //ctr.Name = name;
    ctr.ID= name;
      

  5.   

    为什么不用占位符那?
    用div好么?
      

  6.   

    疑点:你那ascx中的HastTable并没作用上========================================能说清楚点么?谢谢。
      

  7.   

    这个问题真是太奇怪了,难道是asp.net的bug?不信大家可以试试
      

  8.   

    看下这个对楼主有没有什么帮助:http://www.cnblogs.com/wljcan/archive/2004/06/14/15604.html