Avatar billede speedy Nybegynder
22. juni 2009 - 14:39 Der er 6 kommentarer

Differentiering af usercontrols

Hej,

Jeg har brug for at kunne differentiere hvilken usercontrol der skal vises afhængig af en variabel. Jeg har skitseret mit kode herunder:

<%
    int i = 2;

    switch (i)
    {
        case 1:
            %>
                <uc1:MyUserControl ID="MyUserControl1" runat="server" />
            <%
            break;
        case 2:
            %>
                <uc1:MyUserControl ID="MyUserControl2" runat="server" />
            <%
            break;
        case 3:
            %>
                <uc1:MyUserControl ID="MyUserControl3" runat="server" />
            <%
            break;
    }
%>


I ovenstående tilfælde er hensigten kun at indsætte MyUserControl2. Umiddelbart er det også det der sker hvis man kigger på outputtet, men bagved bliver pageLoad event'et fyret på alle 3 usercontrols.

Kan det virkelig passe? og i så fald, hvordan kan jeg undgå det?
Avatar billede aaberg Nybegynder
22. juni 2009 - 14:48 #1
Her er en måde at gøre det på:

I din markup skriver du:

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

I din kode, i Page_Load eventet, skriver du:


int i = 2;

myPlaceHolder.Controls.Clear();
switch(i)
case 1:
  myPlaceHolder.Controls.Add(new MyUserControl1());
  break;
case 2:
  myPlaceHolder.Controls.Add(new MyUserControl2())
  break;
case 3:
  myPlaceHolder.Controls.Add(new MyUserControl3())
  breka;
Avatar billede speedy Nybegynder
22. juni 2009 - 15:09 #2
Det hjælper på at pageLoad kun bliver kaldt på den korrekte usercontrol, men til gengæld er den ikke synlig på sitet?
Avatar billede aaberg Nybegynder
22. juni 2009 - 15:23 #3
Ok, prøv dette i page_load i stedet for:

int i = 2;

Control controlToLoad;

switch(i)
{
case 1:
  controlToLoad = LoadControl("MyUserControl.ascx");
  break;
case 2:
  controlToLoad = LoadControl("MyUserControl.ascx");
  break;
case 3:
  controlToLoad = LoadControl("MyUserControl.ascx");
  break;
}

myPlaceHolder.Controls.Add(controlToLoad);
Avatar billede speedy Nybegynder
22. juni 2009 - 15:30 #4
Nej det giver samme resultat - pageLoad i usercontrol kaldes, men indholdet bliver ikke rendered.
Avatar billede aaberg Nybegynder
22. juni 2009 - 15:37 #5
Virker fint hos mig!

Kan jeg se noget kode?
Avatar billede speedy Nybegynder
22. juni 2009 - 15:48 #6
Det virker også nu - jeg troede bare at jeg kunne skrive koden i mit ascx-fil...som her:

        <asp:PlaceHolder ID="myPlaceHolder" runat="server" />
        <%
            myPlaceHolder.Controls.Add(LoadControl("MyUserControl.ascx"));   
        %>


Men det skal åbenbart ligge i pageLoad
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester