2010-04-02 6 views
5

J'ai une page C#/ASP.NET .aspx qui déclare deux contrôles représentant chacun le contenu d'un onglet. Je veux un argument de chaîne de requête (par exemple,? Tab = 1) pour déterminer lequel des deux contrôles est activé. Mon problème est, ils vont tous deux à travers les événements d'initialisation et peupler leurs contrôles enfants, gaspillant les ressources du processeur et ralentir le temps de réponse. Est-il possible de les désactiver d'une manière ou d'une autre afin qu'ils ne subissent aucune initialisation?Comment déclarer un contrôle d'utilisateur Web C# mais l'empêcher d'être initialisé?

Ma page .aspx ressemble à ceci:

<% if (TabId == 0) 
    { %> 
<my:usercontroltabone id="ctrl1" runat="server" /> 
<% } 
    else if (TabId == 1) 
    { %> 
<my:usercontroltabtwo id="ctrl2" runat="server" /> 
<% } %> 

Et cette partie fonctionne très bien. Je supposais que le <% aurait signifié que le contrôle ne serait pas réellement déclaré et ne serait donc pas initialisé, mais ce n'est pas le cas ...

Répondre

7

Si le code côté serveur inline/spaghetti n'aide pas, je ne peux penser qu'à une solution alternative: évitez de déclarer les contrôles dans le balisage. Au lieu de cela, chargez le contrôle que vous voulez réellement sur la page à partir de votre gestionnaire d'événements Page_Init. La méthode Page.LoadControl() peut être utilisée pour cela:

void Page_Init(object sender, System.EventArgs e) 
{ 
    Control tab; 

    switch (TabId) 
    { 
     case 0: tab = LoadControl("usercontroltabone.ascx"); break; 
     case 1: tab = LoadControl("usercontroltabtwo.ascx"); break; 
     default: tab = LoadControl("defaulttab.ascx"); break; 
    } 

    somePlaceholder.Controls.Add(tab); 
} 
+0

Je suis d'accord que le code spaghetti doit disparaître. La logique doit rester dans le codebehind pour que les objets restent orientés objet. – Daniel

+0

De cette façon fonctionne bien, la mise en garde est si vous dépendez de viewstate. Viewstate n'est pas chargé automatiquement sur les contrôles ajoutés dynamiquement. –

+0

@Chuck: Si ma mémoire me sert bien (cela fait un certain temps que j'ai beaucoup travaillé avec des formulaires web) cela dépend vraiment de * quand * les contrôles sont chargés. Je crois que le chargement dans 'Page_Init' plutôt que' Page_Load' résout (la plupart des) les problèmes viewstate. –

1

Déplacez le code d'initialisation hors du. votre propre méthode publique personnalisée et appelez explicitement l'initiateur, le cas échéant.

0

Appliquez votre logique dans le codebehind.

Déclarez le contrôle:

<my:usercontroltabtwo id="ctrl2" Visible="False" runat="server" /> 

Et puis définir la visibilité:

if(TabId == 0) 
{ 
ctrl1.Visible = true; 
} 
else if(TabId == 1) 
{ 

ctrl2.Visible = true; 
} 
+2

Cela ne va pas aider. – SLaks

+0

@Chuck: C'est essentiellement ce que je faisais, mais ctrl1 et ctrl2 (et tous leurs contrôles enfants) ont tous eu les événements de démarrage de toute façon, ce que j'essaie d'éviter. –

+0

Ajout au commentaire de SLaks: Cette approche ne fera que * rendre * le contrôle, mais elle sera toujours chargée et initialisée dans l'arbre de contrôle. Essentiellement, c'est ce que le PO a déjà. –

0

méthode UserControl.dispose() arrêt usercontrol événement page_load au feu.

+0

Cela n'a pas fonctionné pour moi. J'ai juste semblé fouiller ma page. –