01. februar 2006 - 18:24Der er
11 kommentarer og 1 løsning
Opdatering af controller i webusercontrols ved et event
Hej kloge mennesker.
Lige til sagen: I mit projekt har jeg oprettet en klasse Basket der repræsenterer en indkøbskruv. Basket har et event (ItemsChanged) der fyres af når jeg kører metoden Basket.Add(item). I projektet findes der også 2 usercontrolls, BasketStatus og SelectItemForBasket. De to usercontrols deler en instans af Basket via Sessions variablen.
Idéen er så at når brugeren tilføjer noget til indkøbskurven i SelectItemForBasket uc'en, så fyres eventet ItemsChanged på kurven, således at usercontrol BasketStatus kører sin eventhandler og opdaterer sine labels med den opdateret information.
Jeg har indsat break points og set at eventhandleren der skal opdaterer kurvens status i usercontrol BasketStatus bliver kørt og den rigtige værdi bliver tilskrævet den rigtige label, men når siden vises har labelen ikke ændret værdi. hvorfor ikke?
Kan det have noget at gøre med at usercontorl BasketStatus er blevet skrevet ud til den form som jeg har lagt den på? Ellers ved jeg det ikke.
Glæder mig til jeres dejlige svar. 100% tak, Martin.
Jeg har tilføjet mine usercontrols ved drag and drop fra solution explorer. Det giver følgende kode i min WebForm1.aspx fil: <%@ Register TagPrefix="uc1" TagName="ActivityList" Src="ActivityList.ascx" %> <%@ Register TagPrefix="uc1" TagName="BasketInfoBox" Src="BasketInfoBox.ascx" %>
Src stemmer ikke helt overens med de navne jeg har givet tidligere, but not to worry.
opdaterer du dine labels i din eventhandler i basketstatus? mvh (hvis du kan vise lidt illustrerende kode ville det være fint... umiddelbart er der ikke noget i scenariet der ikke skulle kunne lade sig gøre).
Jeps. Eventhandleren i uc BasketStatus opdaterer en label med kurvens informationer (hvor mange vare der er i den, i dette tilfælde aktiviteter.) Her er lidt kode.
Funktionen Basket.Add(...) der tilføjer et item til indkøbskurven. Basket objektet ligger i sessionsvariablen og Add(...) bliver kaldt fra SelectItemFromBasket uc'en. public void Add(BasketItem newItem) { foreach(BasketItem item in this.basketItems) if(item.ID == newItem.ID) throw new Exception(item.Titel + "allready exsists in the basket.");
basketItems.Add(newItem); this.raiseContentChanged(); //fyrer ContentChanged eventet på kurven. }
sorry ... får ingen mails fra exp :o( du abbonnerer kun på event hvis det ikke er et postback - altså kun ved første load. den slags huskes ikke - så det skal du gøre hver gang.
// i webusercontrol1 if(!this.IsPostBack) man.Bang += new TestApp.middleman.BangEventHandler(man_Bang);
bare slet første linie - så der bare står: man.Bang += new TestApp.middleman.BangEventHandler(man_Bang);
... jeg vil anbefale dig at centralisere den kode du har omkring din sessionvariabel man.
Tak for kommentaren snepnet. Den fik mig et skridt videre. Du har delvist ret. ved at sætte et break point i eventhandleren man_Bang() kan jeg se at den kører det antal gange den er blevet tilføjet til eventet.
Det er ikke helt optimalt, nogen ide til hvordan det kan undgås? Din kommentar fik mig et skridt videre, så skriv lige et svar, så drysser der point af :)
nåja ... det var jo et sessionobject :o) .... du kan rydde op efter dig sådan her:
// der hvor du også abbonnerer på eventet protected override void OnUnload(EventArgs e) { man.Bang -= new TestApp.middleman.BangEventHandler(man_Bang); base.OnUnload(e); }
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.