动态添加控件的事件处理程序不起作用

时间:2015-03-18 11:02:51

标签: c# asp.net ajax updatepanel eventhandler

我正在使用更新面板向我的网页添加动态控件。我也为这个动态控件创建了一个事件处理程序。因此,虽然控件已添加到网页中,但此控件的事件处理程序不起作用。

我的c#代码

protected void Button1_Click(object sender, EventArgs e)
{
    CheckBox cbTest = new CheckBox();
    cbTest.Text = "Click me for fun";
    cbTest.AutoPostBack = true; 
    cbTest.CheckedChanged+=new EventHandler(cbTest_CheckedChanged);
    UpdatePanel1.ContentTemplateContainer.Controls.Add(cbTest);
    DynamicPlaceHolder.Controls.Add(cbTest);
}
public void cbTest_CheckedChanged(object sender, EventArgs e)
{
    TextBox1.Text = "Yes. It worked!!!";
}

我的Aspx代码。

<asp:ScriptManager ID="ScriptManager1" runat="server">
</asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
    <ContentTemplate>
        <fieldset>
            <legend>UpdatePanel</legend>
            <asp:PlaceHolder ID="DynamicPlaceHolder" runat="server" ></asp:PlaceHolder>
            <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="Button" />
        </fieldset>
    </ContentTemplate>
</asp:UpdatePanel>
<asp:TextBox Width="200px" runat="server" ID="TextBox1"></asp:TextBox>

单击按钮时会发生什么,复选框已创建。但是,当我选中复选框时,面板只是刷新,文本框没有更新,文本“是的。它工作!!!”。

1 个答案:

答案 0 :(得分:0)

首先,为什么要将CheckBox添加到UpdatePanel1.ContentTemplateContainer甚至DynamicPlaceHolder

所以改成它:

//UpdatePanel1.ContentTemplateContainer.Controls.Add(cbTest);
DynamicPlaceHolder.Controls.Add(cbTest);

您最好在Page_Load中分配事件:

protected void Page_Load(object sender, EventArgs e)
{
    for (int i = 0; i < DynamicPlaceHolder.Controls.Count; i++)
    {
        Control ctrl = DynamicPlaceHolder.Controls[i];
        if (ctrl is CheckBox)
        {
            CheckBox chk = (CheckBox)ctrl;
            chk.CheckedChanged += new EventHandler(cbTest_CheckedChanged);
        }
    }
}