2009-11-19 4 views
2

À la publication: Comment puis-je accéder aux contrôles ASP.NET dans mon fichier code-behind, qui sont ajoutés par programmation?Accès aux contrôles ajoutés par programmation à la publication

J'ajoute un contrôle CheckBox à un contrôle Placeholder:

PlaceHolder.Controls.Add(new CheckBox { ID = "findme" }); 

contrôles ajoutés dans le fichier ASPX font leur apparition bien dans Request.Form.AllKeys sauf ceux que j'ajouter programatically. Qu'est-ce que je fais mal?

Activer l'utilisation de ViewState sur les contrôles n'aide pas. Si seulement il était aussi simple que cela :)

+1

avez-vous créé un contrôle dynamique dans l'événement init? –

+0

N ° Sur Page_Load – roosteronacid

Répondre

4

Vous devez recréer votre contrôle dynamique lors de la publication:

protected override void OnInit(EventArgs e) 
{ 

    string dynamicControlId = "MyControl"; 

    TextBox textBox = new TextBox {ID = dynamicControlId}; 
    placeHolder.Controls.Add(textBox); 
} 
+0

Cela ne réinitialiserait-il pas l'état du contrôle? – roosteronacid

+0

Non, ce ne serait pas. Pour charger l'état correctement, le même ID de contrôle dynamique est requis - chaque fois que vous le recréer. – ika

+0

cela a été une bouée de sauvetage, merci –

0
CheckBox findme = PlaceHolder.FindControl("findme"); 

Est-ce que vous voulez dire?

+0

Pas exactement. Je veux accéder au contrôle sur la publication. – roosteronacid

0

Vous devez ajouter l'ajouter dynamiquement le contrôle pendant Page_Load pour construire la page correctement à chaque fois. Et puis dans votre (je suppose le bouton), vous pouvez utiliser une méthode d'extension (si vous utilisez 3.5) pour trouver le contrôle dynamique que vous avez ajouté dans le Page_Load

protected void Page_Load(object sender, EventArgs e) 
    { 
     PlaceHolder.Controls.Add(new CheckBox {ID = "findme"}); 
    } 

    protected void Submit_OnClick(object sender, EventArgs e) 
    { 
     var checkBox = PlaceHolder.FindControlRecursive("findme") as CheckBox; 
    } 

Méthode d'extension trouvé here

public static class ControlExtensions 
{ 
    /// <summary> 
    /// recursively finds a child control of the specified parent. 
    /// </summary> 
    /// <param name="control"></param> 
    /// <param name="id"></param> 
    /// <returns></returns> 
    public static Control FindControlRecursive(this Control control, string id) 
    { 
     if (control == null) return null; 
     //try to find the control at the current level 
     Control ctrl = control.FindControl(id); 

     if (ctrl == null) 
     { 
      //search the children 
      foreach (Control child in control.Controls) 
      { 
       ctrl = FindControlRecursive(child, id); 
       if (ctrl != null) break; 
      } 
     } 
     return ctrl; 
    } 
} 
+0

Cela ne réinitialiserait pas l'état du contrôle? – roosteronacid

+0

Si la case à cocher est cochée (true) sur la page Web pendant le Page_Load, elle sera lue comme false, mais dans le gestionnaire d'événements pour le clic sur le bouton, la valeur correcte sera cochée (true) –

Questions connexes