15. oktober 2007 - 09:23Der er
12 kommentarer og 1 løsning
Global event-handling
Jeg stiller problemet op teoretisk og bagefter et konkret eksempel.
Jeg vil høre om der er mulighed for at definere et event i et globalt område hvor abonnementerne på eventet ikke behøver kende til udbyderne af eventet?
Konkret eksempel: Jeg er i et multi-bruger miljø (asp.net). Der er mulighed for at skifte sprog ved tryk på en knap. Jeg har nogle objekter der ligger i en kurv. I princippet kender disse objekter intet til det objekt der repræsenterer siden hvorpå skift-sprog knappen sidder. Dog vil jeg gerne have mulighed for at når en bruger trykker på skift sprog knappen, at dette event bliver affyret, og de objekter der ligger i kurven skal altså så notificeres så de kan opdatere deres attributter fra databasen selvstændigt.
Er dette muligt, og i så tilfælde hvordan kan jeg gøre det?
Det vil kræve at jeg opretter en instans af klassen som jeg kender i siden med knappen altså:
Et sted, opret: SprogStyring ss =new SprogStyring(); Gem dette object I knap-handleren, skift sproget: protected void EnglishFlagImageButton_Click(object sender, ImageClickEventArgs e) { ss.Sprog="en-US" ; // Nu affyres eventet }
I min objekt konstrutør er jeg vel så også nødt til at kende denne klasse på en måde. Altså:
public product(Sprogstyring ss) { ss.OnSprogSkift+=new SprogSkift(eventhandler); } private void eventhandler() { //Gør noget }
Jeg vil netop gerne undgå at skulle sende Sprogstyring med som parameter i min objekt-konstruktør. Hvis jeg istedet laver klassen statisk, vil det da have effekt på andre brugeres objekter som abonnerer på samme event?
Du behøver ikke oprette en instans hvis du gør det alt sammen static.
Alternatit kan du oprette instansen og gemme den i din sessionen. Det skal du nok under alle omsændigheder hvis sprogvalget skal huskes når navigere videre til andre side på dit site.
> Hvis jeg istedet laver klassen statisk, vil det da have effekt på andre brugeres objekter som abonnerer på samme event?
Det tør jeg ikke sværge på. Jeg tror det dog ikke - hvis noget skal huskes på tværs af alle brugere skal man jo igang med noget Global.asa eller noget i den stil.
Jeg vil umiddelbart gætte på at en static-klasse kun høre til den konkrete session. Det må dog være til at lave en hurtig test.
Ville det hele ikke rimeligt hurtigt gå i kage hvis det ikke er de samme instances der bliver brugt ?
SprogSkift ligger i session ... men hvad med alle ens controls/class ? Det skal vel være de samme for at det hele vil virke? der kan jo ske at blive oprettet nye ... så skal de vel igen tilføjes ?
og blive de gamle automatisk unscribed til eventen ?
Sidder og roder med nogle knapper som skal opdateres .. jo faktisk samme problem som "forceprogrammer" sidder med ... men synes ikke det virker ...
Klassen som har samme funktion som "SprogStyring" bliver gemt i Session, dvs der burde kun være 1 ....
På nogle af siderne subscriber jeg så på den event ... men den er altid tom(null) ... selvom den burde mindst have 1 subscriber ...: fra min load: if (!IsPostBack) { Group g = Misc.GetGroup(); g.OnGroupChange += new EventHandler(g_OnGroupChange); }
der bliver Group hentet fra session .. og så subscribed til den event ... Men følgende er altid null: if (OnGroupChange != null) { OnGroupChange(this, new EventArgs()); }
mærkeligt ... men jeg vil lige kigge videre på det ... måske noget simpelt jeg har glemt ...
Hey. Der kommer nogle andre ting op der skulle løses. Jeg endte med i første omgang blot at opdatere objekterne manuelt i en løkke, men jeg vil skifte det ud med events sidenhen, så jeg bare skal affyre eventet istedet.
Tak for hjælpen, jeg vender muligvis tilbage snart :D Nielle, læg et svar
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.