Accéder aux contrôles créés dynamicment (c #)

Dans mon code derrière (c #), j’ai créé dynamicment des RadioButtonLists avec plus de RadioButtons dans chacune d’elles. Je mets tous les contrôles à un panneau spécifique. Ce que j’ai besoin de savoir, c’est comment accéder à ces contrôles plus tard, car ils ne sont pas créés dans un fichier .aspx (par glisser-déposer de la boîte à outils)?

J’ai essayé ceci:

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

“test1” et “test2” n’apparaissent pas dans ma page. Cela signifie que quelque chose ne va pas avec cette logique. Des suggestions que pourrais-je faire?

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 de manière dynamic 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 à l’intérieur de l’object Session. Sur la méthode PageLoad j’ai transmis ces mêmes données pour recréer les contrôles dynamics.

Ce que je suggère est: Écrivez une méthode pour créer les contrôles dynamics.

Sur la méthode PageLoad, vérifiez si c’est une publication …

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

Une chose vraiment importante: atsortingbuez des ID uniques à vos contrôles créés dynamicment afin qu’ASP.NET puisse recréer les contrôles liant leurs gestionnaires d’événements existants, en restaurant leur ViewState, etc.

 myControl.ID = "myId"; 

J’ai eu du mal à apprendre comment cela fonctionne. Une fois que vous apprenez, vous avez le pouvoir entre vos mains. Les commandes créées dynamicment ouvrent un nouveau monde de possibilités.

Comme Frank l’a mentionné: vous pouvez utiliser le mot clé “is” de cette manière pour vous faciliter la vie …

 if(child is RadioButtonList) 

Remarque: il est utile de mentionner la page Présentation du cycle de vie des pages ASP.NET sur MSDN pour référence ultérieure.

Quand faites-vous cela dans votre code? Assurez-vous de le faire au bon moment dans le cycle de vie ASP ou vos contrôles n’existent pas encore: http://msdn.microsoft.com/en-us/library/ms178472.aspx

Je ne pense pas que la création de contrôles dans le chargement de page soit une solution immédiate, tout d’abord, le cycle de vie de asp.net commence par l’initialisation, les données de ViewState, le chargement de données PostData; Charge d’object, etc.

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

Le tout de suite fait à PageInit, ou si est un contrôle (OnInit).

La prochaine difficulté est que, dans PageInit, vous ne disposez pas de ViewState Available, si vous devez reconstituer le nombre d’objects dont vous avez besoin pour stocker du contexte / des informations dans un champ masqué, puis récupérez ces informations dans PageInit, Créez les objects et le tour est joué!

Exemple:

imaginez que vous ayez besoin de créer des TextBox 1..N, vous créez un champ caché html (pas avec runat = serveur), par exemple NumberOfTextBoxes.

Lorsque vous exécutez le code PageInit: vous récupérez la valeur, par exemple numberOfTextBoxes = Request.Form [“NumberOfTextBoxes”], puis vous créez les TextBox.

Rappelez-vous que le plus important est de faire correspondre le nombre et l’ordre des contrôles existants stockés dans l’état ViewState.