-aspx
  <asp:RadioButtonList ID="RadioButtonList1" runat="server" AutoPostBack="True" RepeatDirection="Horizontal" OnSelectedIndexChanged="RadioButtonList1_SelectedIndexChanged">
            <asp:ListItem Selected="True" Value="1">数字1</asp:ListItem>
            <asp:ListItem Value="2">数字2</asp:ListItem>
        </asp:RadioButtonList></div>
        <table id="table1"  runat="server">
        </table>
        <asp:PlaceHolder ID="holder" runat="server"></asp:PlaceHolder>
-cs
public partial class Default2 : System.Web.UI.Page
{
    DropDownList dd;
    protected void Page_Load(object sender, EventArgs e)
    {
       
    }    void BindDD()
    {
        dd = new DropDownList();
        dd.Items.Add(new ListItem("Floor1", "F1"));
        dd.Items.Add(new ListItem("Floor2", "F2"));
        dd.Items.Add(new ListItem("Floor3", "F3"));
        dd.Items.Add(new ListItem("Floor4", "F4"));
        dd.Items.Add(new ListItem("Floor5", "F5"));
        dd.Items.Add(new ListItem("Floor6", "F6"));
        dd.SelectedIndexChanged += new EventHandler(dd_SelectedIndexChanged);
        dd.AutoPostBack = true;
        HtmlTableRow tr = new HtmlTableRow();
        HtmlTableCell td = new HtmlTableCell();
        tr.Cells.Add(td);
        td.Controls.Add(dd);
        this.table1.Rows.Insert(0, tr);
    }
    protected void RadioButtonList1_SelectedIndexChanged(object sender, EventArgs e)
    {
        BindDD();
    }    void dd_SelectedIndexChanged(object sender, EventArgs e)
    {
        
        TextBox tb = new TextBox();
        tb.Text = this.dd.SelectedValue;
        this.holder.Controls.Add(tb);
    }
}

解决方案 »

  1.   

    在BindDD()的最后一句加个标记:
    如:
    ViewState["AddedDDL"] = "1";在Page_Load中.if(ViewState["AddedDDL"]!= null && ViewState["AddedDDL"].ToString() == "1")
    {
       this.BindDD();
    }
      

  2.   

    能所说这样的理由是什么吗?对于动态构建的对象,因该在回传的时候在构建一次,不过在page——load里面这么做就不明白了,以前想的是在oninit里面再去重附加到控件树一次。
      

  3.   

    原因就是你说的:回传的时候在构建一次page_load也好,oninit也好.主要是要在事件处理前重新创建