04. februar 2010 - 11:34Der 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);
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.
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 } } }
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); }
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.
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.
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
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
Synes godt om
Ny brugerNybegynder
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.