2010-10-27 7 views
0

Je suis en train d'ajouter un contrôle à l'intérieur d'un contrôle utilisateur:erreur lors de l'ajout d'un contrôle à un contrôle utilisateur

 LinkButton l = new LinkButton(); 
     l.Text = "Test"; 
     l.OnClientClick = "TestClick"; 
     l.ID = "TestID"; 
     l.Page = Page; 
     Page.Controls.Add(l); 

je reçois cette erreur lorsque la page se charge:

Un unhandled Une exception a été générée lors de l'exécution de la requête Web en cours. Les informations concernant l'origine et l'emplacement de l'exception peuvent être identifiées à l'aide de la trace de la pile d'exceptions ci-dessous.

[InvalidOperationException: la collection a été modifiée; l'opération d'énumération peut ne pas s'exécuter.] System.Web.UI.ControlCollectionEnumerator.MoveNext() +8677726 System.Web.UI.Control.RenderChildrenInternal (HtmlTextWriter writer, enfants ICollection) +217 System.Web.UI.Control.RenderChildren (HtmlTextWriter writer) +8 System.Web.UI.Page.Render (HtmlTextWriter writer) +29 System.Web.UI.Control.RenderControlInternal (HtmlTextWriter, adaptateur ControlAdapter) +27 System.Web.UI.Control. RenderControl (écrivain HtmlTextWriter, adaptateur ControlAdapter) +100 System.Web.UI.Control.RenderControl (écrivain HtmlTextWriter) +25 System.Web.UI.Page.ProcessRequestMain (Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint) 3060"

Suis-je simplement pas autorisé à ajouter des contrôles à une page par code-behind lorsque je suis dans un contrôle utilisateur Web personnalisé? L'erreur ne se produit pas si je ne fais pas ce contrôle.

Répondre

2

Vous devez vous assurer que le contrôle est ajouté pendant la phase PreInit du page's life cycle. Fondamentalement, une fois l'événement Init déclenché, vous ne devez pas modifier les contrôles de la collection de contrôles de la page.

+0

+1 Vous avez oublié le bit PreInit. –

2

Il est parce que vous l'ajoutez aux commandes de la PAGE et non dans votre contrôle utilisateur ...

Votre code sera appelé de la page, quand la page initialise ses contrôles, et évidemment à ce point vous ne pourrez pas ajouter le contrôle supplémentaire à l'arbre de contrôle existant (partiellement initialisé) de la page ...

En outre, il est toujours prudent pour ajouter des contrôles uniquement à votre contrôle utilisateur que de travailler avec les contrôles de la page comme vous ne le savez pas, quelle page peut finir par utiliser votre contrôle.

Essayez ceci:

this.Controls.Add(l) 
1

Pour autant que je sais que vous devez utiliser un contrôle PlaceHolder si vous souhaitez ajouter dynamiquement des contrôles

More info here

+1

L'espace réservé vous aidera à déterminer où un contrôle est rendu. Cependant, il ne sera pas prudent d'ajouter des contrôles trop tard dans le cycle de vie de la page. – jball

Questions connexes