04. august 2011 - 09:03Der er
32 kommentarer og 1 løsning
Dynamisk indlæsning af .ascx (usercontrols)
Jeg har en UserControl - Lad os kalde den for 'main.ascx'. I denne 'main.ascx' usercontrol indlæser jeg dynamisk diverse andre usercontrols.
Jeg har en løkke hvori jeg indlæser en liste af usercontrols og loader dem ind vha. var ctrl = LoadControl(myUsercontrolName);
Nu er det interessant hvordan jeg i 'main.ascx' kan have adgang til mine asp.net kontroller fx. mine knapper eller andre kontroller...
Skal jeg prøve at bruge noget nedarvning for at få adgang til mine under usercontrols?
I så fald hvordan gør man det? Det meste virker efter hensigten...men jeg har bare ikke adgang fra main.ascx til fx. mine TextBox'es i mine under usercontrols.
Det vil være ret fedt, hvis det kan lade sig gøre...
Det er altid svært at forklare på skrift, så det stadigvæk kan forstås...jeg har lavet nedenstående illustration / pseudokode. Håber det hjælper på forståelsen af det, jeg prøver at opnå ;)
Du skal nok angive præcist hvilken kontrol det er.. og altså ikke benytte "var" eller "Control" eller hvad det nu er for en de arver fra.
noget lignende det her vil virke.
foreach (Control control in controls) //med controls mener jeg den liste hvor du har ControlA og ControlB. { ControlA controlA = control as ControlA; if (controlA != null) { controlA.TextBoxA.Text = "Jeg fandt A"; break; } ControlB controlB = control as ControlB; if (controlA != null) { controlB.TextBoxB.Text = "Jeg fandt B"; break; } }
Jeg har ikke tested det med "var", så jeg gætter bare på at den måske går ind og finder "UserControl" og så kan du ikke tilgå dens elementer direkte.. Du skal også lige huske at gøre dine elementer public.
I min 'usercontrolA.ascx.designer.cs' har jeg forsøgt at gøre min textbox public:
public global::System.Web.UI.WebControls.TextBox mintextboxA;
Men det hjalp ikke :/
Tror du har ret...jeg indlæser blot en 'kopi' af 'usercontrolA.ascx' og derfor vil min 'mintextboxA' holde en tom værdi, selvom jeg har lagt en default værdi i den.
Tricket skal være at kunne tilgå 'mintextboxA' feltet og hente værdien ud enten under en Page_Load på main.ascx eller i en MinSubmitBtn_Click event:
* Main.ascx.cs * protected void Page_Load(object sender, EventArgs e) { var ctrl = LoadControl("usercontrolA.ascx"); var mintextboxA = (TextBox)ctrl.FindControl("mintextboxA"); var vaerdi = mintextboxA.Text; // vaerdi er tom :( } ------------- protected void MinSubmitBtn_Click(object sender, EventArgs e){ var ctrl = LoadControl("usercontrolA.ascx"); var mintextboxA = (TextBox)ctrl.FindControl("mintextboxA"); var vaerdi = mintextboxA.Text; // vaerdi er tom :( }
Ja, meget fint eksempel...men problemet er ikke at tildele en værdi på min textbox. Det er efterfølgende under en submit at hente den indtastede / default værdi ud igen. :)
Prøv at lave en Default.aspx hvori du har en main.ascx.
I main.ascx.cs under page_load indlæs din userControlA.ascx. og indsæt en <asp:Button ID="SubmitBtn" runat="server" Text="Send" onclick="SubmitBtn_Click" /> i markup filen (main.ascx).
I din userControlA.ascx har du en <asp:TextBox name="mytextbox">
I din main.ascx.cs har du: protected void SubmitBtn_Click(object sender, EventArgs e) { var ctrl = LoadControl("userControlA.ascx"); var mytextbox = (TextBox)ctrl.FindControl("mytextbox"); var vaerdi = mytextbox .Text; }
Ahh du har lagt det ind på en knap.. men problemet er at page load ikke bliver afviklet på din user control på det her tidspunkt.. derfor vil den være tom.
Du kan evt. lave en metode hvor i din user control, som du kan kalde fra din Main control:)
UserControl i mit kunne se sådan her ud: public partial class ControlA : System.Web.UI.UserControl { public void Initialize() { TextBoxA.Text = "Start værdi"; } }
og i din kode:
protected void Page_Load(object sender, EventArgs e) { if(IsPostBack){ var ctl = (userControlA)Page.LoadControl("userControlA.ascx"); ctl.Initialize(); var minTextBox = (TextBox)ctrl.FindControl("minTextBox"); var vaerdi = minTextBox.Text; } }
Du kan måske nøjes med at markere at værdierne skal læses fra kontrollen i Main kontrollen og vente med at læse dem ud til Main kontrollen kalder onPreRender.. (bare override metoden... den arves fra UserControl).
Jeg kan ikke huske rækkefølgende, men hvis den kalder page load på UserControlA før onPreRender bliver kaldt på Main controllen, så vil det virke..
om ikke andet så ved du hvad problemet er, så måske kan du komme frem til en løsning.. ellers kan jeg nok bikse noget sammen.
Ja, jeg prøver mig lige frem. Håber du ligeledes kan se udfordringen...
Istedet for at samle indtastede værdier i de enkelte sub usercontrols, forsøger jeg at samle op på dem i en overordnet usercontrol inde i submit knappens OnClick event. :D
Hmmm det er lidt interessant min submit knap i min main.ascx submitter tilsyneladende ikke værdier på min under userkontroller. Hvis jeg smider en submit knap ind i underuser kontrollen kan jeg tilgå værdierne i mine felter...
Damn...har prøvet en del...men tror ikke det kan lade sig gøre... :S
Jeg troede en server side button altid fremprovokerer et post, men tilsyneladende kan jeg kun få fat i det indtastede indhold, hvis en button ligger i samme userkontrol som mine felter...smider jeg knappen ind i main.ascx så er der ingen værdi i feltet...
Jeg er ærligt ikke helt sikker på hvad du prøver på:) Det er måske ikke den rigtige løsning du vælger til dit problem.
Du kan dog hente værdierne på den gode gamle måde.
var textboxa = Request["idpåtextboxa"];
det virker da... husk at kigge i kildekoden efter dine id'er for at teste. Du kan gøre det programmelt senere.. din usercontrol sætter prefix på dens elementer.
Jeps...det var oprindeligt lavet på den gamle måde at requeste værdierne på, men så udnytter man ikke ikke ASP.Net fuldt ud. Jeg er klar over id'erne får et prefix, når man bruger asp.net kontrollerne...jeg finder en løsning, jeg giver ikke op...der skal måske vendes lidt rundt i min kode...
Sagen er helt enkelt...
man har en usercontrol som holder en hel masse andre userkontroller med felter.
Der indsættes en knap i hoved userkontrollen...og i hoved userkontrollens codebehind under (PostBack) eller i knappens Click Event samler noget logik alle felternes værdier....det må kunne lade sig gøre...
Så har jeg yderligere fået lavet en generic metode, der håndterer udvinding af værdierne:
protected void SubmitBtn_Click(object sender, EventArgs e) { var value = RetrieveValue<MinSubCntrl01, TextBox>("MinTextBox02").Text; var value2 = RetrieveValue<MinSubCntrl02, TextBox>("MinTextBox02").Text; }
private TF RetrieveValue<T, TF>(string fieldName) where T : UserControl where TF : class { var res = Controls.OfType<Main>().Select(c => c).Single().Controls.OfType<T>().Select(s => s.FindControl(fieldName)).Single(); return res as TF; }
Ret elegant og stærkt!!
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.