Avatar billede kapoou Nybegynder
04. februar 2010 - 11:34 Der er 17 kommentarer og
1 løsning

Dynamisk rendercontrol med codebehind

Jeg har en aspx side som dynamisk skal render en usercontrol. Der sker dog det at scriptet i usercontrolen ikke bliver eksekveret, men det er kun indholdet i formen der bliver renderet. Koden i usercontrolen ligge i Page_Load.

Nedenfor kan I se hvordan koden ser ud i aspx filen.

.aspx
Control thisControl_content = (Control)Page.LoadControl("controls/control_content.ascx");
thisControl_content.ID = "navn";
stringWriter = new StringWriter();
htmlWriter = new HtmlTextWriter(stringWriter);
                    thisControl_content.RenderControl(htmlWriter);
s = stringWriter.ToString();
Response.Write(s);

---------------------------

.ascx
<div class="textcontent"><asp:Literal runat="server" ID="litContent"></asp:Literal></div>

Nedenstående kode ligger i Page_Load

litContent.Text = "Teksten som skal i usercontrolen";

-------------------------------

Outputter bliver kun
<div class="textcontent"></div>
Avatar billede janus_007 Nybegynder
04. februar 2010 - 12:42 #1
Er det fordi du skal have tekst ind i user controllen, tekst som kommer fra din main page?
Avatar billede kapoou Nybegynder
04. februar 2010 - 13:09 #2
janus_007 <-- Nej det er det ikke. Jeg skal have skrevet teksten der bliver defineret i koden i usercontrollen.
Avatar billede Syska Mester
04. februar 2010 - 22:11 #3
Debug det ...

og se om du kommer ind i din Page_Load på din UserControl.

mvh
Avatar billede Syska Mester
04. februar 2010 - 22:13 #4
Måske du skal bruge en anden event ... da den måske ikke automatisk bliver wired up ...

I din Constructor i din UC ... sørg for at load eventen bliver hooked up ...

Jeg tror ikke "auto event wiring" bliver kørt når man loader UC'er automatisk nu jeg tænker over det.

mvh
Avatar billede kapoou Nybegynder
05. februar 2010 - 07:03 #5
Nej det ser ikke ud til at Page_Load bliver kørt. Jeg kan dog sige at når jeg tilføjer en placeholder til min aspx side og adder controlen til den i stedet for at printe den ud via en writer så bliver Page_Load kørt.
Avatar billede Syska Mester
05. februar 2010 - 08:11 #6
Ja, det er pga din event automatisk bliver wired up.

Og det tror jeg ikke sker når du loader den dynamisk. Derfor prøv overstående ...:

using System;

namespace WebApplication1
{
    public partial class MinControl : System.Web.UI.UserControl
    {
        public MinControl()
        {
            this.Load += new EventHandler(MinControl_Load);
        }

        void MinControl_Load(object sender, EventArgs e)
        {
            // Her smider du din load event
        }
    }
}

Noget ala det ...

mvh
Avatar billede kapoou Nybegynder
06. februar 2010 - 20:41 #7
Den reagerer desværre heller ikke på det.
Avatar billede Syska Mester
06. februar 2010 - 21:22 #8
Post din kode ...
Avatar billede kapoou Nybegynder
06. februar 2010 - 21:45 #9
.aspx.cs

Control thisControl_content = (Control)Page.LoadControl("controls/control_content.ascx");

thisControl_content.ID = "CONTROLID";

stringWriter = new StringWriter();

htmlWriter = new HtmlTextWriter(stringWriter);
               
thisControl_content.RenderControl(htmlWriter);
                   
s = stringWriter.ToString();
Response.Write(s);

.ascx.cs

public partial class Controls_control_content : System.Web.UI.UserControl
{
    public Controls_control_content()
        {
            this.Load += new EventHandler(MinControl_Load);
        }

        void MinControl_Load(object sender, EventArgs e)
        {
            litContent.Text = "GHGHGHG";

            // Her smider du din load event
        }
}

litContent ligger jo så ude i ascx filen.
Avatar billede Syska Mester
06. februar 2010 - 22:13 #10
ahhh,

Du gør det også forkert ... på den måde du gør der bliver load eventen ikke kørt ...

Du skal tilføje den til din side ... altså noget ala:

this.Controls.Add(thisControl_content);

Så skal side nok sørge for at render den for dig.

mvh
Avatar billede kapoou Nybegynder
06. februar 2010 - 22:24 #11
Ok. Grunden til at jeg har gjort det på den måde er at jeg skal have outputter ind i et recordset som går videre ind i xml til xsl. Jeg ved ikke om det er et mærkeligt flow for at få det fra databasen til et xsl skema?

Uanset hvad så har jeg faktisk lige fået det til at fungere så jeg får outputtet igennem writeren. Jeg har lavet en public funktion i controlen som jeg kalder fra aspx siden ved control load. Jeg ved dog ikke helt om det holder i længden da jeg hermed ikke har Page_Init og Page-Load flowet.
Avatar billede Syska Mester
06. februar 2010 - 22:38 #12
Ja, der er i hvert fald ikke specielt meget UserControl over den længere, hvis den ikke bliver smidt ind på siden, men du bare render den i CodeBehind.

Jeg kan ikke lige følge hvad det er du sådan helt basic prøver at lave, men jeg er da glad for at det er kommet til at virke.

mvh
Avatar billede Syska Mester
06. februar 2010 - 22:38 #13
og skulle være svar
Avatar billede kapoou Nybegynder
07. februar 2010 - 00:03 #14
Tak for sparringen. Jeg vil gerne bruge xsl og hiver derfor outputter at usercontrolsne ind i xml'en til xsl'en.
Avatar billede stinejh1980 Nybegynder
26. februar 2010 - 11:52 #15
KAn i se hvorfor følgende virker:
Private Sub ButtonGuide_Level3_Edit_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        Dim UCLI As Control
        UCLI = LoadControl("GreyMenu_Level3.ascx")
        PHInfo.Controls.Add(UCLI)
        Select Case RBContent.SelectedValue
            Case 1 'staff
                Response.Write("RBContent_SelectedIndexChanged: Staff")
            Case 2 'flash
                Response.Write("RBContent_SelectedIndexChanged: Flash")
            Case 3 'special
                Response.Write("RBContent_SelectedIndexChanged: Special")
            Case 4 'non fk change
                Response.Write("RBContent_SelectedIndexChanged: No Change")
        End Select
    End Sub

Men hvis jeg flytter min load control (Se nedenfor) så virker det ikke:
    Private Sub ButtonGuide_Level3_Edit_PreRender(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.PreRender
        Select Case RBContent.SelectedValue
            Case 1 'staff
                Dim UCLI As Control
                UCLI = LoadControl("GreyMenu_Level3.ascx")
                PHInfo.Controls.Add(UCLI)
                Response.Write("RBContent_SelectedIndexChanged: Staff")
            Case 2 'flash
                Response.Write("RBContent_SelectedIndexChanged: Flash")
            Case 3 'special
                Response.Write("RBContent_SelectedIndexChanged: Special")
            Case 4 'non fk change
                Response.Write("RBContent_SelectedIndexChanged: No Change")
        End Select
    End Sub
Avatar billede Syska Mester
26. februar 2010 - 11:58 #16
Hvad virker ik' ?

mvh
Avatar billede stinejh1980 Nybegynder
26. februar 2010 - 12:00 #17
Controlen bliver ikke loaded hvis jeg flyter den ind i min select case
Avatar billede Syska Mester
26. februar 2010 - 12:46 #18
Jeg ville nok køre det i Debug mode og sætte et break point, for at se om den kommer derinde ...

Husk, Autowiring af events ikke virker på UserControls hvis du loader dem dynamisk.

mvh
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