在动态添加的UserControl中向CheckBox添加CheckChanged事件处理程序

时间:2009-09-30 20:23:50

标签: c# asp.net user-controls event-handling

我有一个包含CheckBox和TextBox的UserControl:

<asp:CheckBox runat="server" ID="chk1" />
<asp:TextBox runat="server" ID="tb1" />

在Page_Load上我将其中几个动态地添加到页面上的Panel中:

 //loop through the results from DB
 foreach (Thing t in Things)
 {
    //get the user control
    MyUserControl c1 = (MyUserControl )Page.LoadControl("~/UserControls/MyUserControl.ascx");

    //set IDs using public properties
    c1.ID = "uc" + t.ID;
    c1.CheckBoxID = "chk" + t.ID;
    cl.TextBoxID = "tb" + t.ID;

    //add it to the panel
    myPanel.Controls.Add(c1);

    //add the event handler to the checkbox
    ((CheckBox)myPanel.FindControl(c1.ID).FindControl(c1.CheckBoxID)).CheckedChanged += new EventHandler(CheckBox_CheckedChanged);   
 }

然后我在同一页面中为事件处理程序创建了方法:

protected void CheckBox_CheckedChanged(object sender, EventArgs e)
{
       string test = "breakpoint here";
}

当我在CheckBox_CheckedChanged中放置一个断点时,单击我的复选框时它永远不会被击中。

当我查看视图源时,这是生成的代码:

<input id="ctl00_body_uc1_chk1" type="checkbox" name="ctl00$body$uc1$chk1" checked="checked" />

因此,当我添加事件处理程序时,它似乎没有被提升。这很奇怪,因为它会收集其他所有东西。

我错过了什么吗?

2 个答案:

答案 0 :(得分:2)

添加CheckBox.AutoPostBack属性并将其设置为“true”。

CheckBox cb = ((CheckBox)myPanel.FindControl(c1.ID).FindControl(c1.CheckBoxID));
if(cb != null)
{
     cb.AutoPostBack = true;
}

答案 1 :(得分:1)

“当我在CheckBox_CheckedChanged中放置一个断点时,点击我的复选框后它就永远不会被击中。”

如果要在单击复选框时触发事件,则还需要在复选框中设置AutoPostBack = true。如果您将光标放在文本框中并按返回(导致回发),事件是否会触发?