9
votes

LoadControl vs construction asp.net contrôle

J'ai une question pourquoi nous ne pouvons que ajouter un contrôle dynamique à l'aide de LoadControl. Par exemple: xxx pré>

lorsque dans la méthode de chargement de la page_load, le contrôle de Wucdate est null mais lorsque j'utilise la méthode suivante: p>

   public partial class wucReportParam : System.Web.UI.UserControl
    {
        public Report Report;

        protected void Page_Load(object sender, EventArgs e)
        {
              ctrl = (wucDate)LoadControl(@"Reports\wucDate.ascx");
              pnl.Controls.Add(ctrl);
        }
    }


0 commentaires

4 Réponses :


9
votes

Lors du chargement de manière dynamique d'un contrôle de l'utilisateur, il est important de s'assurer que la pipeline d'événement Standard ASP.NET est initiée et progresse normalement. Lorsque vous utilisez le nouvel opérateur pour créer une instance d'un contrôle utilisateur, le contrôle de l'utilisateur n'est pas correctement ajouté au système d'événement ASP.NET. Si les événements (init, charge, prerender, etc.) ne se dérouleront pas, votre contrôle ne fonctionnera jamais correctement. C'est pourquoi il est nécessaire d'utiliser LoadControl, comme cela garantira que l'instance de votre commande utilisateur est créée correctement et connectée à ASP.NET.


0 commentaires

0
votes

Si je me rappelle, il se rapporte à la manière dont ASP.NET construit les composants de la page au moment de l'exécution. Dans ASP.NET Bien que vos pages aient une classe qui est définie dans votre fichier de code-derrière, leurs types n'existent pas vraiment avant le temps d'exécution. Comme une page, bien que vous ayez un contrôle défini, le type de wucdate n'est pas créé avant d'être inclus au moment de l'exécution. Pour cette raison, le contrôle doit être chargé avec LoadControl afin d'initialiser le type et d'exécuter correctement dans le cycle de vie de la page.

Ceci est au meilleur de ma mémoire, donc si je suis incorrect ici s'il vous plaît faites le moi savoir.


0 commentaires

4
votes

Apparemment, à l'aide de LoadControl avec typeof (ou gettype) a le même problème que d'utiliser "Nouveau" où les contrôles d'enfants ne sont pas initialisés. Utilisation de LoadControl avec une chaîne sur le fichier ASCX fonctionne.

n'initialise pas les commandes d'enfants. P> xxx pré>

fonctionne! P>

LoadControl("Report.ascx");


1 commentaires

Il y a une explication sur la raison pour laquelle vous voyez cela sur le site Docs / Connect: msdn.microsoft.com/en-us/library/ewtd66a0.aspx (faites défiler jusqu'au contenu communautaire) ou connect.microsoft.com/visualstudio/feedback/.../a>



2
votes

L'initialisation des commandes à l'intérieur d'un contrôle de l'utilisateur est entraînée par le fichier ASCX. L'utilisation de «nouveau Somecontrol» ne provoquera pas que cette initialisation fonctionne et même si elle le faisait, toute la conception (marquage) dans le fichier ASCX serait perdue.

N'oubliez pas que la classe "wucdate" n'est que la classe de base que le contrôle de l'utilisateur complet hérite de. Ce n'est pas la même classe que vous obtiendrez lors de l'utilisation de LoadControl ("wucdate.ascx").

Et pour être honnête, LoadControl n'a pas grand chose, si quelque chose, à faire avec le cycle de vie de la page. Cette partie est traitée lorsque vous ajoutez le contrôle à la collection de contrôles du conteneur.


0 commentaires