Добавление обработчика событий CheckChanged в CheckBox внутри динамически добавленного UserControl - PullRequest
2 голосов
/ 01 октября 2009

У меня есть UserControl, который содержит CheckBox и TextBox:

<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 ]

2 голосов
/ 01 октября 2009

Добавьте свойство CheckBox.AutoPostBack и установите для него значение "true".

CheckBox cb = ((CheckBox)myPanel.FindControl(c1.ID).FindControl(c1.CheckBoxID));
if(cb != null)
{
     cb.AutoPostBack = true;
}
1 голос
/ 01 октября 2009

"Когда я ставлю точку останова внутри CheckBox_CheckedChanged, она никогда не срабатывает, когда щелкают по моему флажку."

Если вы хотите, чтобы событие срабатывало при установке флажка, вам также нужно установить AutoPostBack = true в поле флажка. Если вы поместите курсор в текстовое поле и нажмете клавишу возврата (вызывая сообщение назад), событие сработает?

...