2009-09-30 8 views
2

J'ai ajouté dynamiquement un UserControl qui contient un CheckBox et une zone de texte:Ajout d'un gestionnaire d'événements CheckChanged à CheckBox dans un UserControl

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

Sur Page_Load J'ajoute plusieurs d'entre eux les dynamiquement à un Groupe d'étude sur la page:

//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); 
} 

J'ai ensuite créé la méthode pour le gestionnaire d'événements dans la même page:

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

Lorsque je place un point d'arrêt à l'intérieur de CheckBox_CheckedChanged, il n'est jamais atteint lorsque la case my est cliquée.

Quand je regarde la source de vue, c'est le code qui est généré:

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

Ainsi, il ne semble pas ramasser quand j'ajoute le gestionnaire d'événements. C'est bizarre, parce que ça ramasse tout le reste.

Ai-je raté quelque chose?

Répondre

1

"Lorsque je place un point d'arrêt à l'intérieur de CheckBox_CheckedChanged, il ne l'est jamais lorsque la case my est cliquée."

Si vous voulez que l'événement se déclenche lorsque la case à cocher est cliquée, vous devez également définir AutoPostBack = true dans la case à cocher. Si vous placez le curseur dans la zone de texte et que vous appuyez sur la touche retour (retour d'un message), l'événement se déclenche-t-il?

+0

Yep. C'était ça. Je vous remercie! –

2

Ajoutez la propriété CheckBox.AutoPostBack et définissez-la sur "true".

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

Bien sûr! Je vous remercie. –

Questions connexes