2009-02-15 6 views
1

Je rencontre un problème avec un contrôle personnalisé rendant son contenu (contrôles enfants) en dehors de la balise, ce qui entraîne des erreurs et des problèmes d'exécution. Dans une tentative de simplifier les choses autant que possible, j'ai créé le contrôle ci-dessous, mais il a le même problème. J'ai essayé d'hériter de Control, WebControl et CompositeControl tous ayant pour résultat le même problème. Devinant il y a quelque chose d'évident que je me trompe ... Merci pour toute aide. L'ajout du contrôle a pour résultat un balisage en dehors de la balise de formulaire. L'ajout du contrôle via le balisage fonctionne correctement.asp.net contrôle personnalisé rendu en dehors de la balise de formulaire

protected void Page_Load(object sender, EventArgs e) 
{ 
    Controls.Add(new TestControl()); 
} 



... 
<body> 
    <form name="PageForm" method="post" action="default.aspx" id="PageForm"> 
<div> 
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTE5MDEwMTE5MWRkg0FopdvLhTPGxHkGm1xCCOVQz6A=" /> 
</div> 

    <div> 

    </div> 
    </form> 
</body> 
</html> 
<span><input type="submit" name="ctl04$ctl00" value="TestControl!" /></span> 

Répondre

2

Ajout du contrôle à travers la Page.Fo La propriété rm rendra le bouton à l'intérieur du formulaire.

Page.Form.Controls.Add(new Button() { Text = "TestControl!" }); 

Cependant, étant donné que le bouton ne figure pas dans un bloc, comme un < div>, vous pourriez avoir quelques problèmes de mise en page avec ce bouton. Utilisez l'approche de ScarletGarden.

+0

Je suis d'accord que cela fonctionnera mais ce n'est pas très intuitif surtout si quelqu'un d'autre utilise le contrôle et ne sait pas mieux. Comment se fait-il que les autres contrôles personnalisés ne requièrent pas cette approche? Controls.Add (nouveau bouton()); fonctionne très bien. Mon contrôle ne fonctionne pas. Qu'est-ce que je rate? – andleer

+0

Il est plus courant d'inclure des contrôles utilisant un balisage déclaratif, puis d'ajouter manuellement des contrôles à ControlCollection. Vous pouvez associer l'espace de noms MyControls à un préfixe de balise, puis utiliser em comme: sinon, donnez plus d'informations sur votre problème – baretta

1

Votre commande semble ok, je pense que vous avez un problème avec l'ajout de votre commande à votre page,

Ajouter un placeHolder à votre page,

<body> 
    <form id="form1" runat="server"> 
    <div> 
     <asp:PlaceHolder ID="placeHolder" runat="server"></asp:PlaceHolder> 
    </div> 
    </form> 
</body> 

puis ajoutez votre contrôle composite à la collection de contrôles de cet espace réservé comme ça:

TestControl testCtrl = new TestControl(); 
placeHolder.Controls.Add(testCtrl); 
+0

Je pense en théorie que cela fonctionnera mais cela ne rend pas un contrôle personnalisé très général. Certainement pas la façon dont les autres contrôles custome fonctionnent. – andleer

+0

Je me demande comment vous ajoutez votre contrôle à votre page? faites-vous glisser et déposer dans les étiquettes de formulaire? – Canavar

+0

Désolé. En cours d'ajout par programme. Fonctionne bien lorsqu'il est ajouté dans le balisage. – andleer

2

Cela n'a rien à voir avec votre contrôle personnalisé. Votre problème est dû à la façon dont vous ajoutez le contrôle à la page.

Lorsque vous appelez Controls.Add dans votre page de méthode Page_Load, cela est essentiellement un raccourci pour:

Page.Controls.Add(new TestControl()); 

-à-dire, vous ajoutez le contrôle à la fin de l'ensemble de votre hiérarchie de contrôle de page. Lorsque la page est rendue, votre contrôle est rendu après tous les autres - même après la balise de fermeture </html>.

Si vous voulez que votre commande soit rendu à l'intérieur de la forme alors vous devez l'ajouter à la hiérarchie de contrôle de formulaire à la place:

Form.Controls.Add(new TestControl()); 

Si vous avez besoin encore plus positionnement à grains fins, alors vous devez mettre un placeholder (ou div ou span etc) sur votre page dans la position requise et ajoutez votre contrôle à cela, comme dans la réponse de ScarletGarden.

+0

Ok. J'étais définitivement dans la mauvaise direction. J'ai supposé que les contrôles asp.net standard fonctionnaient différemment que le mien, mais ils présentent le même problème lorsqu'il est ajouté à la collection Page.Controls. Ma mauvaise supposition. – andleer

Questions connexes