2010-06-05 7 views
4

Dans mon code derrière (C#), j'ai créé dynamiquement des RadioButtonLists avec plus de boutons radio dans chacun d'entre eux. Je mets tous les contrôles à un panneau spécifique. Ce que je dois savoir est comment accéder à ces contrôles plus tard car ils ne sont pas créés dans le fichier .aspx (avec le glisser-déposer de la boîte à outils)?Accéder aux contrôles créés dynamiquement (C#)

J'ai essayé ceci:

foreach (Control child in panel.Controls) 
    { 
     Response.Write("test1"); 
     if (child.GetType().ToString().Equals("System.Web.UI.WebControls.RadioButtonList")) 
     { 
      RadioButtonList r = (RadioButtonList)child; 
      Response.Write("test2"); 
     } 
    } 

"test1" et "test2" DonT apparaître dans ma page. Cela signifie que quelque chose ne va pas avec cette logique. Toutes les suggestions que pouvais-je faire?

+2

Vous pouvez réécrire la boucle de plusieurs façons, dont 'foreach (liste RadioButtonList dans panel.Controls.OfType ())'. Juste un FYI. Mais utiliser 'child.GetType(). ToString() ...' serait la dernière méthode que j'utiliserais. Par exemple, un 'if' pourrait dire' if (enfant est RadioButtonList) ' –

+0

D'accord avec le commentaire précédent, et ... vous avez vraiment besoin d'un peu de savoir-faire C# sous votre ceinture, des trucs comme" est "mot-clé .. – flq

+0

Merci pour vos suggestions. Fait plus de sens bien que mon code ne soit pas faux. – Aliens

Répondre

2

Vous devez recréer vos contrôles après chaque publication. ASP.NET est sans état, c'est-à-dire que lorsque vous publiez une page sur le serveur, vos contrôles créés dynamiquement ne font plus partie de la page.

La semaine dernière, j'ai dû surmonter cette situation une fois de plus.

Qu'est-ce que j'ai fait? J'ai enregistré les données que j'ai utilisées pour créer les contrôles dans l'objet Session. Sur la méthode PageLoad j'ai transmis ces mêmes données pour recréer les contrôles dynamiques. Ce que je suggère est: Écrivez une méthode pour créer les contrôles dynamiques.

Le contrôle de la méthode PageLoad pour voir si elle est un postback ...

if(Page.IsPostBack) 
{ 
    // Recreate your controls here. 
} 

Une chose très importante: attribuer des identifiants uniques à vos contrôles créés dynamiquement afin que ASP.NET peut recréer les contrôles de liaison de leur événement existant les gestionnaires, la restauration de leur ViewState, etc.

myControl.ID = "myId"; 

moi avons eu du mal à apprendre comment cette chose fonctionne. Une fois que vous apprenez que vous avez le pouvoir dans vos mains. Les contrôles créés dynamiquement ouvrent un nouveau monde de possibilités.

Comme Frank mentionné: vous pouvez utiliser le "est" mot-clé de cette façon de faciliter votre vie ...

if(child is RadioButtonList) 


Note: il vaut la peine de mentionner la page ASP.NET Page Life Cycle Overview sur MSDN pour plus référence.

+0

Ok, je vais suivre vos conseils. – Aliens

+0

Dites-moi quelque chose. Si je sauvegarde une zone de texte dans une session (dois-je enregistrer chaque session dans une session différente?), Comment puis-je obtenir un texte de cette zone de texte sur une page suivante? ? J'ai mis textbox par exemple, mais c'est similaire avec RadioButtons. – Aliens

+0

@Aliens: l'objet Session est unique dans ASP.NET pour chaque utilisateur, donc il n'y a pas de session différente. Vous utilisez Session.Add ("objectName", objectValue). Si les contrôles sont recréés après chaque publication, ils conserveront leurs valeurs (à cause de ViewState) étant donné que vous suivez mes conseils. –

0

Je ne pense pas que la création de contrôles dans le PageLoad est la première chose à faire, d'abord le cycle de vie asp.net va de l'initialisation; Load ViewState Data; Load PostData; Charge d'objets, etc.

si vous créez des contrôles au Page_Load vous perdrez le ViewState, événements, etc.

Le tout de suite fait à PageInit, ou si un contrôle est (OnInit).Le prochain problème est que chez PageInit, ViewState n'est pas disponible, si vous avez besoin de reconstruire le nombre d'objets dont vous avez besoin pour stocker du contexte/info dans un champ caché et récupérer ces informations sur PageInit, Créez les objets et voila!

Exemple:

Imaginez que vous devez créer TextBoxes de 1..n, vous créez champ caché html (pas avec runat = server), par exemple NumberOfTextBoxes.

Lorsque vous exécutez le code PageInit: vous récupérez la valeur par ex. numberOfTextBoxes = Request.Form ["NumberOfTextBoxes"], puis vous créez les TextBoxes. Rappelez-vous que le plus important est de faire correspondre le nombre et l'ordre des contrôles existants stockés ViewState.

+0

Je n'ai pas de problème avec le nombre de zones de texte et leurs identifiants. Mais je ne peux pas obtenir les textes des boîtes de texte (s'il vous plaît regarder mes commentaires dans la réponse de Leniel Macaferi). Si vous avez une solution, je serai reconnaissant. – Aliens

Questions connexes