[C#] Kan main form niet sluiten

Pagina: 1
Acties:

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Topicstarter
Het probleem
In me Windows applicatie maak ik gebruik van één main form. Vanuit dit main form worden er meerderen forms geladen en getoont.

Zodra ik de form FrmAddAction laad en open kan ik me applicatie niet meer afsluiten door rechtsboven op kruisje te drukken of op welke manier dan ook.
Dit gebeurt alleen als er in het Load event van FrmAddAction een MessageBox word getoont en ik in de event method het form ook gelijk weer sluit.

De code ziet er als volgt uit:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
private void FrmAddAction_Load(object sender, System.EventArgs e)
{
    _isDirty = false;
    Text += _organisatie.ToString();

    _factory = Factorys.GetOrganisatieFactory();

    ContactPersoonCollection contactPersonen = _factory.GetContactPersonenFromOrganisatie(_organisatie);
    
    if(contactPersonen.Count == 0)
    {
        MessageBox.Show(this, "De geselecteerde organisatie heeft geen contact persoon. Er is "+
            "minimaal 1 contact persoon nodig om een actie te kunnen toevoegen.", Application.ProductName,
            MessageBoxButtons.OK, MessageBoxIcon.Warning);

        Close();
        return;
    }


    foreach(ContactPersoon contactPersoon in contactPersonen)
    {
        cboContactPersoon.Items.Add( contactPersoon );
    }
}


Omgeving
WinForms
.NET Framework 1.1
Windows XP Pro

Maar wat heb je dan al geprobeerd?
Alles in de ctor gooien, dit werkt prima, maar ik wil het niet in me ctor hebben. Want dit is weggelecht voor het Load event.

Ook de method Dispose aanroepen voor het sluiten leverd ook geen positief resultaat op. Verder heb ik nog wat met de code geschoven etc, maar niets wil helpen.
Ook www.deja.com helpt deze keer niet evenals de /14-search.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:24
Ik vind het zowiezo ranzig dat je in een load event al je form wilt gaan sluiten.

Eigenlijk zou je eerst moeten checken of je het form wel moet openen; zoja: open het form, zonee, open het form niet.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Topicstarter
whoami schreef op dinsdag 22 februari 2005 @ 13:47:
Ik vind het zowiezo ranzig dat je in een load event al je form wilt gaan sluiten.

Eigenlijk zou je eerst moeten checken of je het form wel moet openen; zoja: open het form, zonee, open het form niet.
Met een extra method (CanOpen) of hou realiseer jij dit normaal?

Ik vind de beredenering goed, ik dacht juist altijd dat je dit soort dingen in je Load event moest stoppen.

[ Voor 15% gewijzigd door pjvandesande op 22-02-2005 13:55 ]


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

Als ik jou was zou ik de controle die je nu in je load doet even doen in de procedure die het form aanroept: In het geval dat je nu het form sluit, laadt je het dan niet eens. Dit lijkt me een stuk netter, omdat je dan je form alleen laadt als je aan de juiste voorwaarden voldoet.

My personal website


  • dotnetter
  • Registratie: Februari 2005
  • Laatst online: 06-10-2025

dotnetter

aka BamiSoep

Zoek het eens in deze richting, het venster word pas gesloten als de messagebox weg is..

C#:
1
2
3
4
5
6
7
8
9
10
11
12
if(contactPersonen.Count == 0)
{
        DialogResult result = MessageBox.Show(this, "De geselecteerde organisatie heeft geen contact persoon. Er is " +
        "minimaal 1 contact persoon nodig om een actie te kunnen toevoegen.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        
        while (result == DialogResult.None)
        {
            // Doe niks...  
        }
        Close();
        return; 
}


Getest en werkt, ik denk dat je het in deze richting moet zoeken, omdat een Messagebox een DialogBox is die toegang tot andere schermen blokkeert..

[ Voor 11% gewijzigd door dotnetter op 22-02-2005 18:05 ]

| Allemaal spulletjes | Ik flickr! >Hier<


Verwijderd

[quote]dotnetter schreef op dinsdag 22 februari 2005 @ 17:51:

C#:
1
2
3
4
5
6
        while (result == DialogResult.None)
        {
            // Doe niks...  
        }
        Close();
        return; 


en ondertussen maar afvragen waarom je computer enorm traag wordt, terwijl de messagebox getoond wordt...........

Maar goed, de richting is er, alleen die while is overbodig, want er is geen while-conditie, maar een constante

[ Voor 10% gewijzigd door Verwijderd op 22-02-2005 18:55 ]


  • dotnetter
  • Registratie: Februari 2005
  • Laatst online: 06-10-2025

dotnetter

aka BamiSoep

en ondertussen maar afvragen waarom je computer enorm traag wordt, terwijl de messagebox getoond wordt...........
-Voor de goede orde (sorry ik ben koppig |:( ) .. 98% System idle time (in mijn test iig XP 2600+).....
Maar goed, de richting is er, alleen die while is overbodig, want er is geen while-conditie, maar een constante
Volgens mij is er wel een while conditie aangezien de MessageBox Asynchroon van de rest van de applicatie loopt, je zult dus moeten wachten tot de 'controlle' teruggeven word aan de form.
Net zoals je bij multithreading als je een 'join()' gebruikt om aan te geven dat er gewacht moet worden tot de thread terugkeert.

| Allemaal spulletjes | Ik flickr! >Hier<


Verwijderd

dotnetter schreef op dinsdag 22 februari 2005 @ 19:39:
[...]


-Voor de goede orde (sorry ik ben koppig |:( ) .. 98% System idle time (in mijn test iig XP 2600+).....


[...]
Waarom denk je dat ik het ook doorgestreept had......
Volgens mij is er wel een while conditie aangezien de MessageBox Asynchroon van de rest van de applicatie loopt, je zult dus moeten wachten tot de 'controlle' teruggeven word aan de form.
Net zoals je bij multithreading als je een 'join()' gebruikt om aan te geven dat er gewacht moet worden tot de thread terugkeert.
Stap er maar eens met debugging doorheen. Je zult zien dat je messagebox opgegooid wordt en pas als je op de OK button klikt ga je weer verder. Ook als je het logisch bekijkt. Waar had die result dan geupdate moeten worden? Had er toch minstens iets in de while moeten staan die result ging updaten.

zelfde alsof je deze code neerzet:
C#:
1
2
3
4
5
6
int i = 0;
while(i != 0)
{
//doe niets
}
// i is nu gelijk aan 0

  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Topicstarter
dotnetter schreef op dinsdag 22 februari 2005 @ 17:51:
Zoek het eens in deze richting, het venster word pas gesloten als de messagebox weg is..

C#:
1
2
3
4
5
6
7
8
9
10
11
12
if(contactPersonen.Count == 0)
{
        DialogResult result = MessageBox.Show(this, "De geselecteerde organisatie heeft geen contact persoon. Er is " +
        "minimaal 1 contact persoon nodig om een actie te kunnen toevoegen.", Application.ProductName, MessageBoxButtons.OK, MessageBoxIcon.Warning);
        
        while (result == DialogResult.None)
        {
            // Doe niks...  
        }
        Close();
        return; 
}


Getest en werkt, ik denk dat je het in deze richting moet zoeken, omdat een Messagebox een DialogBox is die toegang tot andere schermen blokkeert..
He gaaf, niets doen! O+

Maargoed, daar schiet je dus niets mee op. De Form.ShowDialog() method wacht al op een return van het type DialogResult. Dus de while is iets overbodig.

En natuurlijk werkt het, dat wist ik als. Alleen kan ik daarna mijn Main form niet meer op een normale manier sluiten. Alleen als ik de Message loop van de main thread exit sluit me programma. Dit is natuurlijk niet helemaal de bedoeling, maar het is ook niet de bedoeling een MessageBox te showen in een Load event dus en daarna te exit'n.

Ik heb er voor gekozen om dit maar in de ctor te doen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 10:24
En toch is het ugly questa.
Ik zou, zoals ik al eerder gezegd heb, en zoals OZ-gump ook al zegt, eerst checken of de form kan geopend worden.

https://fgheysels.github.io/


  • pjvandesande
  • Registratie: Maart 2004
  • Laatst online: 01-05 19:09

pjvandesande

GC.Collect(head);

Topicstarter
whoami schreef op woensdag 23 februari 2005 @ 10:12:
En toch is het ugly questa.
Ik zou, zoals ik al eerder gezegd heb, en zoals OZ-gump ook al zegt, eerst checken of de form kan geopend worden.
Ik heb het nu inderdaad niet in het load event gedaan, zelf vond ik dit ook al ransig maar dacht dat het er nou eenmaal voor bedoelt was, maar er is nu gewoon een method bij gezet Prepaire en deze returned een boolean.
Pagina: 1