2009-01-13 11 views
3

J'ai créé un contrôle utilisateur ASP.NET standard, y compris le fichier ascx. Par exemple:Lorsque j'instancie un composant usercontrol ASP.NET à l'exécution, pourquoi ignore-t-il le fichier ASCX?

MyUserControl.ascx 
MyUserControl.ascx.cs 

Alors j'essaie de rendre le contrôle manuellement, à l'exécution, en utilisant un code similaire au code suivant:

var testMyUserControl = new MyUserControl(); 
var textWriter = 
    new HtmlTextWriter(
     new System.IO.StringWriter(new StringBuilder())); 
testMyUserControl.RenderControl(textWriter); 
Console.Write(textWriter.InnerWriter.ToString()); 

Rien que je mets dans le fichier ASCX semble rendre - soit HTML statique ou tous les contrôles .NET. Cependant, si je substitue la méthode Render() dans le contenu de code-behind et de sortie manuelle, il rendra.

Qu'est-ce qui me manque ici?

Répondre

8

Vous n'avez pas besoin de rendre votre contrôle vous-même. Si vous devez ajouter à la page dynamique, vous le faites comme:

UserControl myControl = (UserControl) Page.LoadControl("~/Controls/MyControl.ascx"); 
Page.Controls.Add(myControl); 

Très probablement, vous aurez envie de le placer dans une certaine partie de la page, au lieu d'utiliser Page.Controls, utilisez un espace réservé:

<asp:Placeholder ID="myPlaceHolder" runat="server" /> 

et utilisez le code comme ceci:

myPlaceholder.Controls.Add(myControl); 

Ceci est la meilleure façon d'ajouter un contrôle dynamique , mais si vous pouvez le faire instea déclarative d ce serait beaucoup plus facile.

<%@ Register TagPrefix="my" TagName="Control" Src="~/Controls/MyControl.ascx" %> 

<my:Control ID="myControl" runat="server" /> 

Rappelez-vous: si vous ajoutez le contrôle dynamique, assurez-vous de re-add the control every page load.

+0

La méthode que vous proposez fonctionnerait très bien si je faisais cela dans un projet de site Web, mais comment le ferais-je dans une application de console, par exemple, dans une classe normale qui ne s'étend pas? – Jonathan

+0

Vous ne pouvez pas. La méthode LoadControl requiert un chemin virtuel à partir d'un serveur Web (Casini, IIS). C'est la seule façon dont UserControl est destiné à être utilisé. –