Avatar billede forceprogrammer Nybegynder
15. oktober 2007 - 09:23 Der 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?

På forhånd mange tak for hjælpen.

venlig hilsen
Forceprogrammer
Avatar billede nielle Nybegynder
15. oktober 2007 - 10:10 #1
Skil koden til at styre sprogskift ud fra siden hvor knappen er - placer den som en klasse i app_code.

Klassen kunne f.eks. se mogemlunde sådan her ud:

    public delegate void SprogSkift();

    class SprogStyring
    {
        public event SprogSkift OnSprogSkift;

        private string _Sprog = "da_DK";

        public string Sprog
        {
            get { return _Sprog; }
            set
            {
                _Sprog = value;
                if (OnSprogSkift != null)
                    OnSprogSkift();
            }
        }
    }

Når du trykker på SkiftSprog knappen sætter den denne klasses Sprog-property. Dette vil så automatisk affyre OnSprogSkift.

Din kurv skal så blot subscripe til denne klasse, og bør i pticippet ikke kende den side hvor SkiftSprog knappen sidder.

PS: Det kan meget vel tænkes at et par af definitionerne skal have en static erklæring på i din egen implementering.
Avatar billede forceprogrammer Nybegynder
15. oktober 2007 - 10:57 #2
Hej Nielle.
Tak for dit hurtige svar

Jeg har et spørgsmål ang. din kode.

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?
Avatar billede nielle Nybegynder
15. oktober 2007 - 11:20 #3
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.
Avatar billede Syska Mester
20. oktober 2007 - 19:24 #4
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 ?
Avatar billede nielle Nybegynder
20. oktober 2007 - 19:27 #5
Hvis den gemems i sessionen er der jo kun den en instans i spil.

Men jeg vil nu stadig mene at det er static-varianten der skal bruges.
Avatar billede Syska Mester
20. oktober 2007 - 20:00 #6
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 ...

// ouT
Avatar billede Syska Mester
20. oktober 2007 - 20:12 #7
max dumme slag til mig selv ...

Min GetGroup der hele tiden lavede et nyt object ... virker som det skal *heheh*

Tror sq jeg skal i seng

// ouT
Avatar billede Syska Mester
20. oktober 2007 - 21:05 #8
okay ... lost igen ...

Alt virker ... min method på siderne bliver kørt ... men GUI bliver ikke opdateret ...

Vi snaker stadig asp.net ...

Bliver events kørt meget senere eller ? Jeg er totalt lost ...

// oUT
Avatar billede Syska Mester
20. oktober 2007 - 21:28 #9
Lidt svært at update gui fra den method når man får at vide at:

Response is not available in this context.

hmmmmm ....
Avatar billede nielle Nybegynder
22. oktober 2007 - 19:19 #10
forceprogrammer?
Avatar billede forceprogrammer Nybegynder
24. oktober 2007 - 08:40 #11
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
Avatar billede nielle Nybegynder
24. oktober 2007 - 18:11 #12
Svar :^)
Avatar billede nielle Nybegynder
06. november 2007 - 17:27 #13
Så mangler du bare at acceptere mit svar :^)
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