[C#] Wisselen tussen forms

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb een login script gemaakt voor een applicatie. Het werkt prima alleen ik zit met het volgende.
De Main form die ik gebruik heet Login, hierin bevindt de code die ervoor zorgt dat een child window word geopend als het inloggen succesvol is verlopen.

C#:
1
2
3
4
5
6
7
8
9
Form1 frmMain = new Form1();

// en verderop in de code staat

            if (valid == true)
            {
                this.Hide();
                frmMain.Show();
            }


Bij het runnen log je in, het loginscherm hide zich en Form1 komt tevoorschijn (dit moet de applicatie voorstellen).

Vervolgens wil ik in de applicatie zelf (Form1) een mogelijkheid tot uitloggen via een button aanbieden.
Ik heb al wat zitten spelen maar ik kom er niet uit. De bedoeling is dat dus het loginscherm weer tevoorschijn komt.

Is het overigens wel slim om het inlogscherm als Mainform in te stellen? Of moet dat een Child worden.

Acties:
  • 0 Henk 'm!

Verwijderd

Je zal op de een of andere manier een koppeling naar je loginscherm toe moeten voegen aan je 'mainForm'.

Dit kan op verschillende manieren, de ene netter dan de ander.
De simpelste, maar volgens mij ook meest vieze manier, is een Form meegeven in de constructor.

Dus dan krijg je zoiets:

LoginForm
C#:
1
2
Form1 frmMain = new Form1(this);
//rest hetzelfde 


MainForm
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
//...
private Form parent;

public Form1(Form parent)
{
this.parent = parent;
//Initializecomponent() etc blijft gewoon staan natuurlijk
}

private void Logout()
{
this.Close(); //of Hide, is maar net wat je nodig hebt
parent.Show();
}


Op deze manier doe ik het momenteel ook, maar ik heb het gevoel dat het wel 'iets' netter kan...dus lees ik verder nog even mee in dit topic wat de alternatieven precies zijn ;).

[ Voor 46% gewijzigd door Verwijderd op 30-05-2008 23:10 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik heb je code even uitgeprobeerd maar ik krijg een error namelijk:

Error 1 Keyword 'this' is not available in the current context

Dit gaat over:

C#:
1
        Form1 frmMain = new Form1(this);


Intellisense geeft het keyword 'this' ook niet automatisch aan.

Acties:
  • 0 Henk 'm!

Verwijderd

Heb je de constructor van Form1 wel aangepast zoals beschreven in mn post?
Want bij mijn applicaties werkt dit prima zo...

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
De constructor ziet er nu als volgt uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
private Form parent;
        public Form1(Form parent)
        {
            this.parent = parent;
            InitializeComponent();
        }

        private void LogOut()
        {
            this.Hide(); // or Close
            parent.Show();
        }

        private void logOffbtn_Click(object sender, EventArgs e)
        {
            LogOut();
        }


en de code in het Login form (waar nu een streepje onder 'this' staat) :

C#:
1
        Form1 frmMain = new Form1(this);

Acties:
  • 0 Henk 'm!

Verwijderd

Ik heb even op internet gezocht, wellicht dat dit helpt:

Zet de regel "Form1 frmMain = new Form1(this);" in de Constructor van je LoginForm.
(wel vreemd dat het niet werkt, hier met VS 2005 werkt het prima :? )

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 30 mei 2008 @ 23:36:
Ik heb even op internet gezocht, wellicht dat dit helpt:

Zet de regel "Form1 frmMain = new Form1(this);" in de Constructor van je LoginForm.
(wel vreemd dat het niet werkt, hier met VS 2005 werkt het prima :? )
Ik gebruik ook VS 2005 :). Idd heel vaag. Ik ga bovenstaande even proberen dan. Ik zou ook eventueel mijn solution kunnen sturen

ps: als ik die regel in de constructor plaats dan krijg ik een volgende error namelijk:

Error 1 The name 'frmMain' does not exist in the current context

[ Voor 14% gewijzigd door Verwijderd op 30-05-2008 23:49 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Ja, dan moet je natuurlijk wel een dataveld van frmMain maken...anders is die variabele alleen binnen de constructor bekend. Ik nam aan dat je al wel zo ver was met programmeerkennis ;).

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Verwijderd schreef op vrijdag 30 mei 2008 @ 23:54:
Ja, dan moet je natuurlijk wel een dataveld van frmMain maken...anders is die variabele alleen binnen de constructor bekend. Ik nam aan dat je al wel zo ver was met programmeerkennis ;).
Ahja, ik zat meer na te denken over het feit dat het niet op die andere manier werkte ;)

Nu werkt het in ieder geval. Heel erg bedankt, nu kan ik weer verder 8)

[ Voor 8% gewijzigd door Verwijderd op 31-05-2008 00:14 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Nevermind :) Het lijkt nu prima te werken

[ Voor 90% gewijzigd door Verwijderd op 31-05-2008 00:33 ]


Acties:
  • 0 Henk 'm!

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 10-09 11:15
Je kan ook de static void main method in een aparte class stoppen (volgens mij wordt dat vanaf 2008 standaard zo gedaan) van waaruit je alles regelt. Die opent eerst een login scherm, en deze return een bepaalde waarde of sluit met een bepaalde waarde als je succesvol ingelogd bent. Vervolgens open je dan vanuit die class je main window en als deze gesloten wordt laat je weer het login schem zien. Dan hoeven die windows verder geen weet van elkaar te hebben.

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Acties:
  • 0 Henk 'm!

Verwijderd

Hmm, deze zit ook in 2005 al in een eigen klasse.

Zowel 2005 als 2008 (windows application) program.cs zien er zo uit:

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
   static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(...);
        }
    }


Maar dan haal je dus die Application.Run(...) weg, en maak je zelf Forms aan waar dat nodig is?
Dan moet je dus ook altijd zelf Application.Exit doen ergens?


Heeft iemand anders nog een visie op dit onderwerp toevallig :)?

[ Voor 4% gewijzigd door Verwijderd op 31-05-2008 12:57 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Verwijderd schreef op vrijdag 30 mei 2008 @ 23:21:
Ik heb je code even uitgeprobeerd maar ik krijg een error namelijk:

Error 1 Keyword 'this' is not available in the current context
Dan zit je in een static functie.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Sebazzz
  • Registratie: September 2006
  • Laatst online: 12-09 06:48

Sebazzz

3dp

Volgens mij kan in het Show event van je hoofdformulier het loginformulier aanroepen met de Show methode daarvan. Deze zal een dialogstatus teruggeven welke aangeeft welke knop er is gedrukt. (en in de show event handel je het inloggen dan af)

[ Voor 11% gewijzigd door Sebazzz op 31-05-2008 15:14 ]

[Te koop: 3D printers] [Website] Agile tools: [Return: retrospectives] [Pokertime: planning poker]


Acties:
  • 0 Henk 'm!

Verwijderd

De Main form die ik gebruik heet Login
je kan je mainform benaderen via Application.Mainform, dus om terug te gaan naar je loginform doe je iets van:

C#:
1
2
3
4
if (Application.Mainform!=null){
  Application.Mainform.Show();
  this.Hide();
}

[ Voor 12% gewijzigd door Verwijderd op 31-05-2008 15:18 ]


Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 11-09 12:01
Waarom zou een login form een referentie moeten hebben/gebruiken naar een mainform? Wat is de relatie tussen die twee?

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

  • roy-t
  • Registratie: Oktober 2004
  • Laatst online: 08-09 11:33
Je hoeft een login scherm toch helemaal niet te hiden? Je kan dat scherm toch gewoon closen en op het moment dat je uitlogt een nieuwe maken:
C#:
1
2
FrmLogin f = new FrmLogin();
f.show();


en klaar is kees. Of heb je het probleem dat als je FrmLogin afsluit dat je applicatie dan stopt? Als dat gebeurt moet je je MDI form als startup zetten (dwv in je program.cs een MDI scherm maken ipv frmLogin) en je MDIform tijdens het laden/constructen een Login form laten spammen.

Imho hoeft je login scherm niet de hele tijd actief te zijn.

~ Mijn prog blog!


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Als ik het inlogscherm sluit, dan sluit inderdaad de hele applicatie af. Ook ga ik het één en ander wijzigen zodat het login form niet hide maar juist closed. En pas op het scherm gaat spammen als je uitlogt.
Bedankt so far!

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Waarom doe je het niet zo:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[STAThread]
static void Main()
{
    Application.EnableVisualStyles ();
    Application.SetCompatibleTextRenderingDefault (false);

    LoginForm frmLogin = new LoginForm ();
            
    if( frmLogin.ShowDialog()== DialogResult.OK )
    { 
         // melp logic
    }
    else
    {
        return;
    }

    Application.Run (new Form1 ());
}

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

En uitloggen (inc. opnieuw inloggen) dan? De hele applicatie opnieuw starten?

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Hum, daar heb ik over gelezen ... :+

Maar, kan je dan niet deze toer opgaan:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
public static class User
{
        public static void Logon()
        {
            LogonForm f = new LogonForm ();

            if( f.ShowDialog () == DialogResult.OK )
            {
                System.Threading.Thread.CurrentPrincipal = new GenericPrincipal (new GenericIdentity ("..."), new string[] { });

                Console.WriteLine (System.Threading.Thread.CurrentPrincipal.Identity.Name);
            }
            else
            {
                Logoff ();
            }
        }

        public static void Logoff()
        {
            System.Threading.Thread.CurrentPrincipal = null;
        }
}
Dit moet je natuurlijk wel nog even verfijnen, maar je snapt het idee waarschijnlijk wel.

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Ok, die laatste regel moet ik helaas "nee" op zeggen...Threads hebben we (1e jaars HBO Software Engineering) nog niks over gehad.
Het principe van Threads snap ik wel een beetje, maar echt de fijne details snap ik nog niet ;).

Op dit moment heb ik een beetje lopen kloten in de Program.cs, en dit is er bij mij uitgekomen.
Als iemand hier nog een frisse blik op kan werpen, graag :).

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
    static class Program
    {
        private static LoginForm L;
        private static ParafiksitServiceMainForm M;

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

            L = null;
            M = null;

            Login();
            Application.Run();
        }

        static void ToonHoofdScherm()
        {
            L.Close();

            M = new ParafiksitServiceMainForm();
            M.onLogout += Login;
            M.Show();
        }

        static void Login()
        {
            if (M != null)
            {
                M.Close();
            }

            L = new LoginForm();
            L.onLogon += ToonHoofdScherm;
            L.Show();
        }
    }

(het meegeven/bijhouden van welke user in is gelogd zit hier nog niet in verwerkt overigens)

Acties:
  • 0 Henk 'm!

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:07
Verwijderd schreef op vrijdag 06 juni 2008 @ 17:34:
Ok, die laatste regel moet ik helaas "nee" op zeggen...Threads hebben we (1e jaars HBO Software Engineering) nog niks over gehad.
Het principe van Threads snap ik wel een beetje, maar echt de fijne details snap ik nog niet ;).
:?
Er is helemaal niets multi-threading aan dat code-voorbeeld ...

https://fgheysels.github.io/


Acties:
  • 0 Henk 'm!

Verwijderd

Ok, zie je, zelfs dat had ik al niet begrepen :+.

Je eerste voorbeeld kan ik opzich nog wel volgen, daar zie je onderdaad ook een Application.Run(...) terugkomen. Ook dat ShowDialog lukt opzich wel, maar ik heb getracht beide te combineren (dus zowel opnieuw inloggen met een Application.Run / ShowDialog combinatie...maar dat ging niet echt).

Je laatste voorbeeld komt echter geen 'main' form meer in voor, en wat het effect van die CurrentPrincipal is weet ik dus ook niet.
Pagina: 1