2010-04-02 7 views
5

Ho una pagina C#/ASP.NET .aspx che dichiara due controlli che rappresentano ciascuno il contenuto di una scheda. Voglio un argomento stringa di query (ad esempio,? Tab = 1) per determinare quale dei due controlli è attivato. Il mio problema è che entrambi passano attraverso gli eventi di inizializzazione e popolano i controlli figlio, sprecando risorse della CPU e rallentando i tempi di risposta. È possibile disattivarli in qualche modo in modo da non passare attraverso l'inizializzazione?Come si dichiara un controllo utente Web C# ma si impedisce l'inizializzazione?

mia pagina aspx si presenta così:

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

E quella parte funziona bene. Ho assunto che il <% avrebbe significato che il controllo non sarebbe stato effettivamente dichiarato e quindi non inizializzerebbe, ma non è così ...

risposta

7

Se il codice lato server inline/spaghetti non aiuta, posso solo pensare ad una soluzione alternativa: evitare di dichiarare i controlli nel markup. Invece, carica il controllo che vuoi effettivamente sulla pagina dal tuo gestore di eventi Page_Init. Il metodo Page.LoadControl() può essere utilizzato a questo scopo:

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

Sono d'accordo sul fatto che il codice degli spaghetti deve andare. La logica dovrebbe rimanere nel codebehind per mantenere le cose orientate agli oggetti. – Daniel

+0

In questo modo funziona bene, l'avvertenza è se si dipende da viewstate. Viewstate non è caricato automaticamente con controlli aggiunti dinamicamente. –

+0

@Chuck: Se la memoria mi serve correttamente (è passato un po 'di tempo dal momento in cui ho lavorato molto con i moduli Web) dipende molto da * quando * i controlli sono caricati. Credo che il caricamento in 'Page_Init' piuttosto che' Page_Load' risolva (la maggior parte) i problemi relativi allo stato di visualizzazione. –

1

sposta il codice di inizializzazione da .Load e in il tuo metodo pubblico personalizzato e chiama l'iniziatore esplicitamente quando appropriato.

0

Applicare la logica nel codebehind.

Dichiarare il controllo:

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

E quindi impostare la Visibilità:

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

ctrl2.Visible = true; 
} 
+2

Questo non aiuterà. – SLaks

+0

@Chuck: Questo è in pratica quello che stavo facendo, ma ctrl1 e ctrl2 (e tutti i relativi controlli figlio) hanno tutti comunque gli eventi di avvio, che è quello che sto cercando di evitare. –

+0

Aggiunta al commento di SLaks: questo approccio causerà il controllo non a * render *, ma verrà comunque caricato e inizializzato nella struttura di controllo. Essenzialmente, questo è ciò che l'OP ha già. –

0

UserControl.dispose() evento metodo di arresto UserControl Page Load al fuoco.

+0

Questo non ha funzionato per me. Mi è sembrato di manipolare la mia pagina. –