[C#] this.hide();

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo,

Ik heb een hele simpele vraag, dat is het volgende:
Ik houd me de afgelopen weken bezig met Csharp, nou gaat dit mij aardig makkelijk af maar loop tegen een probleem aan.
Ik heb een inlogsysteempje gemaakt, dit is het eerste dat je krijgt wanneer je het programma opent.
Na het inloggen krijg je een "keuze-menutje".
Wanneer je na het inloggen het keuzemenu te zien krijgt, is het de bedoeling dat het inlogscherm weggaat.
Ik heb het volgende geprobeerd:
code:
1
2
3
ingelogd done = new ingelogd();
done.ShowDialog();
this.Hide();


ipv. this.Hide(); heb ik nog: this.Dispose(); & this.Close(); geprobeerd.

Normaalgesproken moet je elke form handmatig sluiten, maar wanneer ik this.Hide(); gebruik en ik heb die forms openstaan, klik ik 1 weg en dan gaat alles weg.

Iemand een idee hoe ik gewoon 1 form sluit?

Bij voorbaat dank.

Met vriendelijke groet,

William

Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

Ik zou het omdraaien. Start je programma op en ShowDialog() je loginformulier.

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op dinsdag 13 juli 2010 @ 23:09:

ipv. this.Hide(); heb ik nog: this.Dispose(); & this.Close(); geprobeerd.
Ik probeer als ik wil stoppen met mijn auto ook altijd de sigarettenaansteker, de airco, 3 radioknoppen en de binnenverlichting en dan de rem :P
Met andere woorden: alle drie lijken ze misschien wel te doen wat je wil maar hebben ze een hele andere betekenis. Ga dan ook niet als een dolle in het rond zitten meppen op alles wat los en vast zit maar lees even de documentatie die er bij hoort. Een druk op F1 op deze methods doet wonderen.

Wat er gebeurt is dat jij het 'opstartform' (in jouw geval het loginform) sluit en dan worden alle child windows ook gesloten; dat is gewoon defined behaviour:
When a form is closed, all resources created within the object are closed and the form is disposed.
Je kunt beter het loginform een value laten returnen bij het sluiten of een event raisen of op eender welke andere manier het "login gelukt/mislukt" laten terug communiceren naar je main (of een andere "owner") en vervolgens in je main (of een andere "owner") weer het volgende form openen (en de constructor bijvoorbeeld het (ingelogde)gebruiker object meegeven).

[ Voor 56% gewijzigd door RobIII op 13-07-2010 23:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Zoals je het nu gedaan hebt, 'ownt' de inlogform waarschijnlijk de rest van de forms (moeilijk te zeggen met de code die je post), waardoor de rest van de forms natuurlijk ook afgesloten worden als je de 'main form' (en daarmee de applicatie) afsluit.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hardstikke bedankt voor alle reacties..! Dat F1 gebeuren is echt handig! normaal krijg je zon kansloos lap text waar je niets aan hebt. Maar zoals ik al zei ben ik niet zo gevorderd en is:
Value returnen, event raisen nog spaans voor mij.
Hieronder heb ik de (amateuristische) code:

code:
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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class inloggen : Form
    {
        public inloggen()
        {
            InitializeComponent();
        }

        private void label3_Click(object sender, EventArgs e)
        {

        }

        private void inloggen_Load(object sender, EventArgs e)
        {

        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "gebruikersnaam" && textBox2.Text == "wachtwoordje")
            {

                ingelogd done = new ingelogd();
                done.ShowDialog();


            }
            else
            {
                MessageBox.Show("Verkeerde inloggegevens!");
            }
        }
    }
}

Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 10-09 15:29

Armageddon_2k

Trotse eigenaar: Yamaha R6

Verwijderd schreef op woensdag 14 juli 2010 @ 10:45:
Hardstikke bedankt voor alle reacties..! Dat F1 gebeuren is echt handig! normaal krijg je zon kansloos lap text waar je niets aan hebt. Maar zoals ik al zei ben ik niet zo gevorderd en is:
Value returnen, event raisen nog spaans voor mij.
Hieronder heb ik de (amateuristische) code:
Code is niet zoveel mis mee, maar je probleem zit hem hier in:

code:
1
2
3
4
5
            {
                ingelogd done = new ingelogd();
                done.ShowDialog();
                Me.close();
            }


Je voert deze code uit in je hoofdform. Je zegt dan ook heel duidelijk:
Me.close
Dus hoofdformulier.close.
Tsj dan sluit je alles af.

Als je nu:
Done.close() doet, sluit je alleen je inlogschermpje af.
Probleem is dat je hem dan opent en meteen sluit.

Wat je wilt, is een inlogscherm dat zelf me.close doet als je op de juiste knop drukt.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
He,

Als ik done.close gebruik, sluit hij ook niet na het inloggen.
me close word niet herkend, of is daar een aparte "namespace" voor nodig? Heb al even gezocht, maar volgens mij niet.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 14 juli 2010 @ 10:45:
Hieronder heb ik de (amateuristische) code:

code:
1
*snip*
Euh; zo werken we hier dus niet. Het is hier niet de bedoeling dat je je code dumpt en wij de fout even voor je aanwijzen ;)
Verwijderd schreef op woensdag 14 juli 2010 @ 11:27:
He,

Als ik done.close gebruik, sluit hij ook niet na het inloggen.
me close word niet herkend, of is daar een aparte "namespace" voor nodig? Heb al even gezocht, maar volgens mij niet.
Je begrijpt het probleem niet: form A opent form B en is daarmee "eigenaar" (owner) van form B. Als je A sluit zal A zijn rommel opruimen en dus B sluiten.

Wat je wil is:
  • X opent A (inlogforumulier)
  • A geeft terug of inloggen geslaagd is
  • Wanneer inloggen geslaagd is opent X vervolgens form B
Hiermee sluit de applicatie vanzelf als inloggen mislukt is omdat X geen form zal openen wanneer A aangaf dat inloggen mislukte.

Of X dan je main() is, of een andere class (of hell, zelfs een ander form) boeit niet.

[ Voor 61% gewijzigd door RobIII op 14-07-2010 11:41 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • beany
  • Registratie: Juni 2001
  • Laatst online: 19:44

beany

Meeheheheheh

Me.Close moet ook this.Close zijn. Me is Visual Basic.Net dacht ik.

Dagelijkse stats bronnen: https://x.com/GeneralStaffUA en https://www.facebook.com/GeneralStaff.ua


Acties:
  • 0 Henk 'm!

  • Armageddon_2k
  • Registratie: September 2002
  • Laatst online: 10-09 15:29

Armageddon_2k

Trotse eigenaar: Yamaha R6

Laat maar foutje

[ Voor 94% gewijzigd door Armageddon_2k op 14-07-2010 12:06 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Bedankt voor de uitleg;)!
Nu snap ik het hele zootje, nu even experimenteren hoe ik in het geopende form controleer of er wat "gepost" is.

Maar bedankt voor alle reacties..!

Acties:
  • 0 Henk 'm!

  • martijn00
  • Registratie: Juli 2006
  • Laatst online: 02-09 13:45
Dit is wat je kunt doen.

In je Main form (je moet je Opacity op 0 zetten in de properties van je main form):

C#:
1
2
3
4
5
6
7
        private void frmMain_Load(object sender, EventArgs e)
        {
                frmLogin Login = new frmLogin();
                Login.ShowDialog();

                this.Opacity = 100;
        }


In je Login form:

C#:
1
2
3
4
5
6
7
8
9
10
11
        private void btnLogin_Click(object sender, EventArgs e)
        {
            if (textBox1.Text == "gebruikersnaam" && textBox2.Text == "wachtwoordje")
            {
                    this.Close();
            }
            else
            {
                MessageBox.Show("Verkeerde inloggegevens!");
            }
        }


Als je het inloggen nog iets beter wilt doen, bijv. om te zorgen dat mensen niet oneindig een wachtwoord kunnen proberen, dan kun je iets als dit doen:

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
        bool IsLogedIn = false;
        int TryedLogins = 0;

        private void btnLogin_Click(object sender, EventArgs e)
        {
               Login(tbUserName.Text, tbPassword.Text);
        }

        private void Login(string username, string password)
        {
            try
            {
                btnLogin.Focus();
                if (ValidateUser(username, password) == true)
                {
                    IsLogedIn = true;
                    this.Close();
                }
                else if (TryedLogins > 1)
                {
                    Environment.Exit(0);
                }
                else
                {
                    tbUserName.BackColor = Color.FromArgb(255, 192, 192);
                    tbUserName.Clear();

                    tbPassword.BackColor = Color.FromArgb(255, 192, 192);
                    tbPassword.Clear();

                    tbUserName.Focus();
                }
                TryedLogins++;
            }
            catch
            {

            }
        }

        protected bool ValidateUser(string username, string password)
        {
                if (username == "" && password == "")
                {
                      return;
                }
        }

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
En daarbij is het misschien handig als je zelf ook nog even je kennis wat bijschaaft; je gebruikt nogal een onorthodoxe methode om het maar even zo te zeggen :X En het geheel is vele malen omslachtiger dan nodig. Los van het feit dat je nogal wat best-practises in de wind slaat (zoals een overbodige try met ook nog eens een lege catch)

[ Voor 43% gewijzigd door RobIII op 14-07-2010 13:17 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

martijn00 schreef op woensdag 14 juli 2010 @ 12:46:
Dit is wat je kunt doen.

In je Main form (je moet je Opacity op 0 zetten in de properties van je main form):

[knip code]
Ik weet niet wat ik erger vind: dat je textbox1 en textbox2 geen andere naam geeft, dat je prefixen gebruikt, dat je twee Engelse variabelennamen verkeerd spelt (IsLogedIn in plaats van IsLoggedIn en TryedLogins in plaats van TriedLogins of beter nog LoginAttempts), dat je authenticatiecode in een form hebt staan, protected gebruikt (ga je die form nog extenden dan?), return; doet in een methode die een bool terug moet geven, of dat je denkt dat een beperking in het programma zoals jij die implementeert iets betekent: je start gewoon de applicatie opnieuw op.

Just my $ 0.02.

RobIII :(

[ Voor 8% gewijzigd door CodeCaster op 14-07-2010 13:28 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

Het lijkt erop dat je het loginscherm als "start" formulier hebt ingesteld, en dat gaat natuurlijk niet werken.

Kijk even in je projectfiles, daar vind je als het goed is een bestand Program.cs. Als je die opent zie je de

static void Main()

methode. Dit is de methode die .net uitvoerd wanneer je je applicatie start. Wat deze methode doorgaans doet is het "main" formulier van je applicatie openen. (dmv System.Windows.Forms.Application.Run)

Als je een loginscherm wilt tonen, en overige initialisatiecode wilt uitvoeren, voordat je je "main" formulier opent kun je dat gewoon in de static void Main() toevoegen.

bv:

static void Main()
{
inloggen login = new inloggen();
login.ShowDialog();
if (login.IsIngelogd)
{
login.Dispose();
System.Windows.Forms.Application.Run(new <main form naam>);
}
else
System.Windows.Forms.Application.Exit();
}

Als je een formulier met de Show() methode laat zien, dan ruimt.net bij Close() het formulier direct op, maar als je ShowDialog() gebruikt gebeurt dit niet, en kun je nadat het scherm gesloten is nog de public properties aanroepen. Als je in je loginscherm dan een property IsIngelogd maakt die aangeeft of het inloggen succesvol is verlopen kun je die uitlezen na de ShowDialog() aanroep.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Thanks!

Dit is mijn inloggen.cs:
code:
1
*snip*


En dit is mijn Program.cs:

code:
1
*snip*


Wat betreft mijn kennis bijspijkeren, heb je volkomen gelijk in dat probeer ik d.m.v. veel lezen/uitproberen te realiseren.

Ty!

[ Voor 76% gewijzigd door RobIII op 14-07-2010 22:22 ]


Acties:
  • 0 Henk 'm!

  • sfranken
  • Registratie: Mei 2010
  • Laatst online: 17-06 20:00
Als ik een snelle tip mag geven : lees je in over C# threading, daarmee kun je makkelijk een applicatie op een andere thread zetten, en zijn ouder killen. Het child form blijft dan bestaan.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 14 juli 2010 @ 21:51:
Thanks!

Dit is mijn inloggen.cs:
code:
1
*snip*


En dit is mijn Program.cs:

code:
1
*snip*
Lees de eerste zin nou nog eens: RobIII in "\[C#] this.hide();"
sfranken schreef op woensdag 14 juli 2010 @ 21:58:
Als ik een snelle tip mag geven : lees je in over C# threading, daarmee kun je makkelijk een applicatie op een andere thread zetten, en zijn ouder killen. Het child form blijft dan bestaan.
En als ik een snelle tip mag geven: Blijf als beginner uit de buurt van threading en ga geen ranzige constructie maken voor een über-simpel probleem :X

Ik zal het simpel uiteenzetten (from scratch, dus begin een nieuw project in VS):
  • Maak een form met de naam LoginForm. Zet daar 2 textboxes op genaamd UsernameTextBox en PasswordTextBox
  • Zet de Modifier properties van deze textboxes op public
  • Zet 2 knoppen op het formulier. 1 met de naam LoginButton en de ander met de naam CnlButton. Geef de LoginButton de waarde "OK" bij het DialogResult property en de ander de waarde "Cancel". Zet voor de PasswordTextbox het UseSystemPasswordChar property op true
  • Maak een nieuw form genaamd MainForm. Dit wordt je applicatie.
En meer dan de volgende code (in program.cs) heb je niet nodig:
C#: program.cs
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
26
27
28
29
using System;
using System.Windows.Forms;

namespace MyApplication
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            using (LoginForm lf = new LoginForm())
            {
                if ((lf.ShowDialog() == DialogResult.OK) &&
                    lf.UsernameTextBox.Text.Equals("Administrator", StringComparison.InvariantCultureIgnoreCase) &&
                    lf.PasswordTextBox.Text.Equals("secret", StringComparison.InvariantCulture))
                {
                    Application.Run(new MainForm());
                }
            }
            
        }
    }
}


Done. Niks geen threads, niks met visibility of opacity, geen smerige Environment.Exit()'s, niets met hiden/closen en zelfs het disposen is geregeld met dank aan de using statement. C'est tout. 9 "regels" handgeschreven code (17 t/m 25), en als ik wat minder scheutig was geweest met enters en accolades zelfs maar 3:
C#:
1
2
3
using (LoginForm lf = new LoginForm())
    if ((lf.ShowDialog() == DialogResult.OK) && lf.UsernameTextBox.Text.Equals("Administrator", StringComparison.InvariantCultureIgnoreCase) && lf.PasswordTextBox.Text.Equals("secret", StringComparison.InvariantCulture))
        Application.Run(new MainForm());


Puntjes van aandacht en ter oefening voor de TS:
  • Bij verkeerde gebruikersnaam/wachtwoord combinatie is er geen feedback. Je kunt het form opnieuw tonen (met een do..while om de validatie bijvoorbeeld) of je kunt de validatie elders doen (of laten doen) en het form pas sluiten wanneer de user/pass combinatie in orde is.
  • Bedenk waarom, als je het form opnieuw toont bij een mislukte login poging waarom (als je het goed gedaan hebt althans!) de username/password nog netjes in de textboxes staan. (Of je dat ook daadwerkelijk wil(!) is een tweede, maar een .Clear() is zo uitgevoerd ;) )
  • De LoginButton zou de default actie van het loginform moeten zijn. Zie het AcceptButton property van het LoginForm
  • De CnlButton zou de "annuleren" actie (ESC drukken) van het formulier moeten zijn. Zie het CancelButton property van het Loginform. Bedenk nu waarom de knop CnlButton heet en niet CancelButton :Y)
  • Uiteraard hoort de daadwerkelijke validatie netjes wegge-abstraheerd te worden etc. etc.
  • ...en nog wel wat andere kleine usability aandachtspuntjes
Makkelijker kan ik het niet maken.

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Echt gigantisch bedankt voor je hulp!! Ik ga het allemaal even bestuderen en uitproberen.

Echt bedankt!! ;-)
Pagina: 1