2009-04-15 7 views
0

j'ai lu sur la création de contrôle dynamique dans ASP.NET ce morceau de texte:création contrôle dynamique

... Lorsque vous utilisez des contrôles dynamiques, vous devez vous rappeler qu'ils existeront jusqu'à la prochaine postback . ASP.NET ne recréera pas un contrôle ajouté dynamiquement. Si vous devez recréer un contrôle plusieurs fois, vous devez effectuer la création du contrôle dans le gestionnaire d'événements Page.Load. Cela a l'avantage supplémentaire de vous permettre de utiliser l'état d'affichage avec votre contrôle dynamique . Même si l'état d'affichage est normalement restauré avant l'événement Page.Load , si vous créez un contrôle dans le gestionnaire pour l'événement Page.Load, ASP.NET appliquera tout état d'affichage informations qu'il a après la Le gestionnaire d'événements de page.load se termine. Ce processus est automatique ...

Je voulais l'essayer par exemple créer un bouton déclarative -

<asp:Button ID="Button1" runat="server" Text="Button" 
      onclick="Button1_Click" /> 

et dynamiquement derrière le code 5 cases -

protected void Page_Load(object sender, EventArgs e) 
{ 
    for (int i = 0; i <= 5; i++) 
    { 
     var chBox = new HtmlInputCheckBox(); 
     Controls.Add(chBox); 
    } 

} 

Mais lorsque je coche certaines cases et que j'appuie sur le bouton, toutes les cases à cocher sont effacées après la publication. Cela signifie qu'ASP.NET ne gère pas automatiquement les états d'affichage des contrôles dynamiques ? J'ai essayé d'activer l'état d'affichage à chaque case et pour toute la page, mais cela ne fonctionne pas. Quelqu'un peut-il expliquer: 1. Pourquoi est-ce le cas? 2. Comment éviter cela?

+0

Salut. Voir le code mis à jour dans mon commentaire, espérons que cela fonctionne. Sinon, écrivez-moi un commentaire, et je verrai si je peux vous aider. – Kirtan

Répondre

0

Les contrôles peuvent être créés sur Page_Init.

protected void Page_Init(object sender, EventArguments e) 
{ 
    //Generate the checkboxes dynamically here. 
    CheckBox c; 
    for (int i = 0; i < 5; i++) { 
    c = new CheckBox(); 
    c.ID = "Checkbox" + i.ToString(); 

    divContainer.Controls.Add(c); //create a div with runat="Server" attribute or use an asp:Panel, etc. container controls. 
    } 
} 

Ensuite, essayez de cliquer à nouveau sur le bouton, l'état sera toujours maintenu.

+0

Je l'ai fait comme vous et Andrew Hare dit, mais aucun changement, peut-i publier mon aspx quelque part ici? – ge1serf

+0

merci pour l'indice divContainer! – ge1serf

2

La raison pour laquelle cela se produit est que, pour que ASP.NET rétablisse les valeurs POSTed, ces contrôles doivent faire partie de la page avant Load. Afin de faire ce travail, vous devez (si possible) créer vos contrôles OnInit de la page.

+0

private void Page_Init (expéditeur d'objet, System.EventArgs e) { pour (int i = 0; i <= 5; i ++) { var chBox = new HtmlInputCheckBox(); Controls.Add (chBox); }} aucun changement :( – ge1serf

+0

Comme l'OP cité, cela fonctionnera déjà pour les contrôles créés dans PageLoad –

+0

J'ai essayé de mettre ID dans les deux méthodes – ge1serf

0

Vous devez définir un ID pour chaque contrôle dynamique afin qu'il puisse être synchronisé entre les publications.

0

Si je comprends bien - il y a peu importe où pour créer des contrôles dans OnInit ou OnLoad (mais certains livres suggère en onLoad), la question est de savoir où les placer - si vous passez par Controls.Add - il Placez-les hors de <form></form> afin que le postback ne prenne pas les états de contrôle. après crétant un espace réservé à l'intérieur <form></form> et ajouter des contrôles dynamiques à cet espace réservé everthing commencer à bien fonctionner.

Questions connexes