Avatar billede pumpin Nybegynder
06. maj 2006 - 11:59 Der er 2 kommentarer

Load usercontrol at runtime

hey eksperter!

Jeg har rodet lidt med at lave en class som henter en template fil ind og loader designet over i en aspx fil og så bytter de [TOKENS] som der benyttes ud med en string, og dette virker også flawless. Men jeg ville heller bytte mine TOKENS ud med usercontrols frem for strings :) Jeg har stjålet iden fra design pattens i PHP hvor dette virker som en drøm. 

Så min første ide var at registre de usercontrols i toppen af min page sådan her:
<%@ Register Src="Banner.ascx" TagName="Banner" TagPrefix="UC" %>

og så bytte min token ud med denne string:
<UC:Banner ID="Banner1" runat="server" />

Men den viser ikke min usercontrol.

Her er alt min kode:

Class Main.cs:

public class main
{
    private string _line;
    private string _template;

    // Constructor som henter template filen ind i den Private variabel _template så den er klar til at manipuleres med.
    public main()
    {
        using (StreamReader sr = new StreamReader(@"C:\Documents and Settings\href\My Documents\Visual Studio 2005\WebSites\TokensTest\main.tpl"))


            while ((_line = sr.ReadLine()) != null)
            {
                _template += _line+ System.Environment.NewLine;
            }
    }


    //Bytter Title token ud med det parameter som bliver med sendt hvis.
    public void ReplaceTitle(string TitleText)
    {
        _template = _template.Replace("[TITLE]", TitleText);
    }


    //Bytter Banner token ud med det parameter som bliver med sendt hvis.
    public void ReplaceBanner(string BannerText)
    {
        //Control Form = new Control();
        //Form.Controls.Add(Control("Banner.ascx"));

        _template = _template.Replace("[BANNER]", BannerText);
    }


    //Bytter Footer token ud med det parameter som bliver med sendt hvis.
    public void ReplaceFooter(string FooterText)
    {
        _template = _template.Replace("[FOOTER]", FooterText);
    }


    //Bytter Menu token ud med det parameter som bliver med sendt hvis.
    public void ReplaceMenu(string MenuText)
    {
        _template = _template.Replace("[MENU]", MenuText);
    }


    //Bytter Content token ud med det parameter som bliver med sendt hvis.
    public void ReplaceContent(string ContentText)
    {
        _template = _template.Replace("[CONTENT]", ContentText);
    }


    //Køres  når alle de tokens som siden benytter er byttede ud. For at skabe den fysiske side.
    public string Create()
    {
        return _template;
    }
}

Default.aspx:

<%@ Page Language="C#" %>
<%@ Register Src="Banner.ascx" TagName="Banner" TagPrefix="UC" %>
<script runat="server">
    private string test;
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!Page.IsPostBack)
        {
            main objMain = new main();
            objMain.ReplaceTitle("Min Title");
            objMain.ReplaceBanner("dette er en lille banner");
            objMain.ReplaceMenu("link<br>link<br>link<br>");
            objMain.ReplaceContent("<h1>Hej med dig</h1><br>");
            objMain.ReplaceFooter("Copyright @ hansen");
            test = objMain.Create();
        }
    }
   
</script>
<% Response.Write(test); %>

Main.tpl:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>[TITLE]</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
      <table width="800px">
        <tr>
          <td colspan="2" style="height:100px">[BANNER]</td>
        </tr>
        <tr>
          <td valign="top">[MENU]</td>
          <td valign="top">[CONTENT]</td>
        </tr>
        <tr>
          <td colspan="2">[FOOTER]</td>
        </tr>
      </table>
   
    </div>
    </form>
</body>
</html> 


i bund og grund tror jeg bare at jeg skal loade mine usercontrols at runtime, sådan at de bliver "renderet" lige inden page_load, men da jeg ikke ved så meget om de forskellige states en .NET aplication gennemgår så det er sikkert der jeg fejler...

Mange Hilsner
  Troels Larsen
Avatar billede dr_chaos Nybegynder
06. maj 2006 - 13:22 #1
en usercontrol loades dynamisk på denne måde:
UserControl uc = LoadControl("sti til usercontrol");
        Page.Controls.Add(uc);
Avatar billede stinejh1980 Nybegynder
26. maj 2008 - 14:08 #2
Men ikke hvis man har flere som skal loades afhængigt af bruger specifikke valg.

Hvad gør man så??
http://www.eksperten.dk/spm/832458
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
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

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