Avatar billede ttgeek Nybegynder
01. februar 2006 - 18:24 Der 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.
Avatar billede ttgeek Nybegynder
01. februar 2006 - 18:31 #1
Det er forresten i et VS2003 Asp.Net 1.1 projekt.
Avatar billede dr_chaos Nybegynder
01. februar 2006 - 19:03 #2
hvordan loader du usercontrollen ?
Avatar billede ttgeek Nybegynder
01. februar 2006 - 19:16 #3
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.
Avatar billede ttgeek Nybegynder
01. februar 2006 - 20:13 #4
Jeg har lige lavet et test projekt med samme problemstilling. Det ser ud til at man skal gentegne sin uc på en eller anden måde... nogen idéer?
Avatar billede snepnet Nybegynder
01. februar 2006 - 20:23 #5
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).
Avatar billede ttgeek Nybegynder
01. februar 2006 - 21:26 #6
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.

Eventhandleren fra BasketStatus uc'en:
private void ActBasket_ContentChanged()
{
  this.lblNumberOfActivities.Text = this.ActBasket.ItemCount.ToString();
}

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.
}
Avatar billede ttgeek Nybegynder
01. februar 2006 - 21:31 #7
Jeg har lavet et test projekt med samme problemstilling: En uc prøver at skyde en anden uc's label. Web Projektet kan hentes her:
http://martin.hostedtechnologies.com:8080/TestApp.zip

Pleeeese hjælp. Kan heller ikke finde nogen der har haft samme problem som mig andre steder :/
Avatar billede ttgeek Nybegynder
01. februar 2006 - 21:39 #8
HowTo: Kør websitet. når man trykker på kanppen, skulle teksten ændres.
Avatar billede snepnet Nybegynder
01. februar 2006 - 23:08 #9
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.

mvh
Avatar billede ttgeek Nybegynder
02. februar 2006 - 00:32 #10
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 :)

mvh - Me
Avatar billede snepnet Nybegynder
02. februar 2006 - 01:44 #11
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);
}

mvh
Avatar billede ttgeek Nybegynder
02. februar 2006 - 12:01 #12
U da man.
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