:Francis: Skrevet 26. august 2009 Del Skrevet 26. august 2009 (endret) Hei. Jeg trenger hjelp til å lage en custom event. Jeg har en klasse CUtilities med en variabel: private static int activeMachine; og metodene: public int getActiveMachine() { return activeMachine; } public void setActiveMachine(int nr) { activeMachine = nr; } som setter og henter den aktive maskinen. Jeg ønsker å kjøre en metode som oppdaterer en ComboBox i en annen klasse når activeMachine endres. Slik jeg forstår det må jeg på en eller annen måte trigge en event når verdien endres, og få metoden updateComboBocOnEvent(object sender, CUtilities e) i den andre klassen til å abonere på eventen slik at metoden kjøres når verdien endres. Problemet er at jeg ikke helt forstår hvordan jeg lager en custom event. Jeg har brukt events på knapper osv mange ganger, men det er ikke vanskelig siden koden blir autogenerert, og alt skjer innenfor en og samme klasse. Mvh Francis Endret 26. august 2009 av :Francis: Lenke til kommentar
Trondster Skrevet 26. august 2009 Del Skrevet 26. august 2009 Properties som wrapper en statisk variabel bør også være statiske selv. Når du endrer en statisk variabel, så skal alle instanser i runtimesystemet av den andre klassen din kjøre en event? Lukter at du kanskje skal omorganisere strukturen? Lenke til kommentar
GeirGrusom Skrevet 26. august 2009 Del Skrevet 26. august 2009 (endret) For å kalle en event er det vanlig å lage en funksjon som heter for eksempel OnMachineChanged som kaller eventet. public static event EventHandler MachineChanged; protected static void OnMachineChanged() { if(MachineChanged != null) MachineChanged(this, EventArgs.Empty); } Dette er heller ikke Java. C# har egen syntaks for get/set: public static int ActiveMachine { get { return activeMachine; } set { activeMachine = value; OnMachineChanged(); } } For å binde dette eventet, gjør du følgende i formen din: private void CUtilities_MachineChanged(object sender, EventArgs e) { UpdateComboBoxOrWhatever(); } public MyFormConstructor() { InitializeComponents(); // Og andre ting du gjør i constructoren CUtilities.MachineChanged += new EventHandler(CUtilities_MachineChanged); } Dette gjør at funksjonen CUtilities_MachineChanged blir kalt. En sidenotis er at det forøvrig ikke er vanlig å prefikse klasser i C#, det er mer en C++ ting, men ikke ulovlig altså. Endret 26. august 2009 av GeirGrusom Lenke til kommentar
:Francis: Skrevet 27. august 2009 Forfatter Del Skrevet 27. august 2009 Tusen takk! Det med get/set ble jeg klar over for en liten stund siden, men har ikke prioritert å programmere om prosjektet. Det har vel ikke noe å si utover at det er best practice i C#? Hvis jeg har tid på slutten skal jeg endre de stedene hvor jeg har brukt Java syntaks --> C# syntaks. Jeg fikk feilmeldingen; Error 1 Keyword 'this' is not valid in a static property, static method, or static field initializer Slik at jeg endret: MachineChanged(this, EventArgs.Empty); til: MachineChanged(new object(), EventArgs.Empty); - Eventet blir trigget med en gang verdien endrer seg - akkurat slik jeg ville Takk igjen! @Trondster; Det du sier om omorganisering av strukturen er absolutt på sin plass, men det er nest siste dag i sommerjobben og det er rett og slett ikke tid til å omorganisere hele programmet. Mvh Francis Lenke til kommentar
GeirGrusom Skrevet 27. august 2009 Del Skrevet 27. august 2009 bytt ut new object() med null. Glemte at funksjonen var statisk ^^ Lenke til kommentar
HDSoftware Skrevet 27. august 2009 Del Skrevet 27. august 2009 Det med properties er vel ikke bare noe som har med best practice å gjøre, men rett og slett måten .NET håndterer propertiene til klassene dine. Å bruke en metode for å lese properties er ikke det samme som å bruke GET/SET da en property er mere "aware" en variabler. Eksempelvis er det jo slik at en property automatisk blir med i et daatagridview. Det gjør ikke variabler selv om de er definert som public. Lenke til kommentar
GeirGrusom Skrevet 27. august 2009 Del Skrevet 27. august 2009 Som HDSoftware sier, så har det noe med hvordan .NET behandler slike ting. Når alt kommer til alt, er en property get rett og slett en funksjon som begynner med get_ men allikevel så er det en forskjell for .NET mellom properties og funksjoner, og dette bunner ut i reflection og lignende (som i DataGridView) Så en bruker properties fordi det har en betydning for .NET selvom det ikke har noen ytelsesmessige fordeler. Skal en skrive C#, kan en godt bruke .NET mekanismene først som sist. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå