Avatar billede lordsaxo Nybegynder
16. december 2005 - 04:00 Der er 5 kommentarer og
1 løsning

Opdatere class når en form lukker

Jeg har en hovedform, hvor jeg skal opdater 6 labels med navne. For at skrive navnene ind, skal man trykke på indstillinger, som åbner et nyt vindue, og som sætter this.Owner.Enabled=false; (Owner er min hovedform, hvor de labes jeg skal opdatere ligger)
Når jeg så har trykket på knappen, og har opdateret variablerne i min class der indeholder de variabler jeg bruger til spillet (ImportentVars), bruger jeg denne:

            this.Owner.Enabled = true;
            this.Owner.Update();
            this.Owner.Refresh();
            this.Close();

Men jeg vil gerne have opdateret min Owner form, så den gører denne funktion:
private void Lykkehjulet_Load(object sender, EventArgs e)

Nogle der hurtigt kan hjælpe mig med at løse dette? Det er meget vigtigt.
Avatar billede spif2001 Nybegynder
16. december 2005 - 09:16 #1
Du skal have en instansen af din MainForm med ind i dit nye Vindue i dens constructor.

private MainForm mForm;

public IndstilForm(MainForm mainForm)
{
  this.mForm = mainForm;
}

når du så lukker, afslutter eller hvad du nu gør, kalder du metoden på den instans:

this.mForm.Lykkehjulet_Load(this, null);

Kræver du gør Lykkehjulet_Load metoden public i din MainForm og at du ikke bruger EventArgs til noget.
Avatar billede herchin Nybegynder
16. december 2005 - 13:04 #2
Den lidt pænere måde ville være at din ChildForm smider et event, som fanges af din MainForm. Din MainForm skal så når eventet er fanget selv bestemme, hvad der skal ske... I dit tilfælde kalde metoden private void Lykkehjulet_Load(object sender, EventArgs e).

Læg mærke til, at din MainForm nu selv håndterer, hvad der skal ske, når din ChildForm smider sit event Updated. Din MainForm bliver altså ikke længere opdateret af en anden form, hvilket klart er at foretrække.

---------------------------------------
Idéen på ChildForm:

public delegate void UpdateDelegate(object sender, EventArgs e);
public event UpdateDelegate Updatet;

Eventet smides således:

if (this.Update != null)
  this.Update(this, new EventArgs());

---------------------------------------
Idéen på MainForm:

private void <Den metode hvor du åbner din childForm>()
{
  ChildForm childForm = new ChildForm();
  childForm.Updated += new ChildForm.UpdateDelegate(this.childFormUpdated);
  childForm.ShowDialog();
}
private void childFormUpdated(object sender, EventArgs e)
{
  Lykkehjulet_Load(sender, e)
  this.Enabled = true;
  this.Update();
  this.Refresh();
}
---------------------------------------
Avatar billede spif2001 Nybegynder
16. december 2005 - 14:34 #3
herchin --> Pænere - ja. Mere bøvlet - ja.

Så længe man ikke opererer i tråde, er det vel ikke nødvendigt at bruge events?

Hvilket leder mig til et andet mysterium:

Jeg har en app hvor jeg bruger tråde, og derfor ikke kan arbejde med at opdatere min MainForm direkte på en instans. Her bruger jeg Formens Invoke() metode og delegates - ikke events.

Hvornår vil man bruge din fremgangsmåde med events og hvornår vil man bruge Invoke()?
Avatar billede lordsaxo Nybegynder
27. december 2005 - 17:38 #4
Har helt glemt at give point. :/ Spif2001, smid lige et svar - så får du point.
Avatar billede spif2001 Nybegynder
28. december 2005 - 07:52 #5
svar :)
Avatar billede herchin Nybegynder
11. januar 2006 - 11:32 #6
Spif -> har slet ikke set dit svar før nu...

Jeg ved nu ikke om jeg synes det er mere bøvlet. Det er jo bare et simpelt event. I virkeligheden er det også bare er Callback via en delegate, så på den måde fungerer det helt på samme måde, som den måde du gør det på med Invoke(). Designmæssigt er det det samme.

Løsningen med et callback som event er, at det gør koblingen mellem de to forms mindre, hvilket jeg da synes er et væsentligt argument for at bruge den løsning. Ikke at jeg ikke kan lide løsningen med Invoke()!
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