Gå til innhold

Anbefalte innlegg

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 av :Francis:
Lenke til kommentar
Videoannonse
Annonse

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 av GeirGrusom
Lenke til kommentar

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

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

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

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...