2010-04-02 6 views
5

Mam stronę .aspx C#/ASP.NET, która deklaruje dwie kontrolki, z których każda reprezentuje zawartość jednej karty. Chcę, aby argument łańcucha zapytania (np.? Tab = 1) określił, która z dwóch formantów jest aktywowana. Mój problem polega na tym, że obydwa przechodzą przez zdarzenia inicjujące i zapełniają swoje kontrole podrzędne, marnując zasoby procesora i spowalniając czas odpowiedzi. Czy da się je jakoś dezaktywować, aby nie przechodziły przez żadną inicjalizację?Jak zadeklarować C# użytkownika sieci Web, ale zatrzymać go od inicjowania?

Moja .aspx strona wygląda tak:

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

I ta część działa dobrze. Zakładam, że ten <% oznaczałoby, że kontrola nie zostanie faktycznie zadeklarowana, a więc nie zainicjowałaby, ale to nie jest tak ...

Odpowiedz

7

Jeśli kod strony wbudowanej/spaghetti nie pomaga, mogę wymyślić tylko jedno alternatywne rozwiązanie: unikaj deklarowania kontroli w znaczniku. Zamiast tego załaduj kontrolkę, którą naprawdę chcesz na stronę z obsługi zdarzeń Page_Init. Metoda Page.LoadControl() mogą być wykorzystane do tego:

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

Zgadzam się, że kod spaghetti musi iść. Logika powinna pozostać w kodzie, aby zachować rzeczy obiektowe. – Daniel

+0

W ten sposób działa dobrze, zastrzeżenie jest w zależności od stanu wyświetlania. Tryb wyświetlania nie jest ładowany automagicznie na dynamicznie dodawanych kontrolkach. –

+0

@Chuck: Jeśli moja pamięć służy mi dobrze (minęło trochę czasu, odkąd dużo pracowałem przy użyciu formularzy internetowych), to naprawdę zależy od * kiedy * formanty są załadowane. Uważam, że ładowanie w 'Page_Init' zamiast w' Page_Load' rozwiązuje (większość) problemów z widokiem. –

1

przeniesienie kodu inicjalizacyjnego z .Load i do własną niestandardową metodę publiczną i w razie potrzeby jawnie wywołaj inicjatora.

0

Zastosuj swoją logikę w kodzie.

stwierdzenie sterowania:

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

a następnie ustaw Widoczność:

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

ctrl2.Visible = true; 
} 
+2

To nie pomoże. – SLaks

+0

@Chuck: Zasadniczo to, co robiłem, ale ctrl1 i ctrl2 (i wszystkie ich kontrolki podrzędne) wszystkie otrzymały mimo wszystko zdarzenia startowe, czego staram się uniknąć. –

+0

Dodawanie do komentarza SLaks: To podejście spowoduje, że kontrola nie będzie renderować *, ale będzie nadal ładowana i inicjowana w drzewie kontrolnym. Zasadniczo to właśnie OP ma już. –

0

UserControl.dispose() metoda zatrzymania usercontrol zdarzeń Page_Load do ognia.

+0

To nie działa dla mnie. Wydawało mi się, że zmieniłem moją stronę. –