Avatar billede delphiuser Mester
11. september 2016 - 22:21 Der er 13 kommentarer og
1 løsning

passing data fra login to main form

Hej Eksperter...
Jeg sidder og roder lidt med noget c# programmering og er stødt på et lille problem. Jeg kan ganske enkelt ikke gennemskue dette. og det generer mig rigtig meget.

Jeg har lavet et lille program hvor jeg skal logge ind. det virker fint nok den finder brugernavn og adgangskode fint i databasen. men mit problem er så når jeg vil gemme to værdier i en class og sende dem over i min main form. hvor den så skal have en refresh. Så den reloader og får ført data fra min classe ind der hvor de skal være. Kan ikke få den til det.

Min main form - Form1.cs ser således ud.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Hansen_Net
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            if (UserDataLogin.loggedIn == "1")
            {
                label3.Text = UserDataLogin.loggedIn;
                label4.Text = UserDataLogin.UserID;
                toolStripStatusLabel1.Text = "Du er logget ind...";
            }
            else
            {
                label3.Text = UserDataLogin.loggedIn;
                label4.Text = UserDataLogin.UserID;
                toolStripStatusLabel1.Text = "Du er ikke logget ind...";
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label3.Text = "";
            label4.Text = "";           
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            login frm2 = new login();
                frm2.Show();
        }
    }
}

Min login.cs form har følgende kode

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Hansen_Net
{
    public partial class login : Form
    {
        private string _con = "server=localhost;database=hansen_net;userid=hansen_net;password=17012005;";

        public login()
        {
            InitializeComponent();
        }

        private void _CheckLogin(string user, string pass)
        {
            MySqlConnection db_connect = new MySqlConnection(_con);
            db_connect.Open();
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = "select * from users where user=@user and pass=@pass";
            cmd.Parameters.AddWithValue("@user", user);
            cmd.Parameters.AddWithValue("@pass", pass);
            cmd.Connection = db_connect;
            MySqlDataReader dr = cmd.ExecuteReader();
            if(dr.Read())
            {
                UserDataLogin.loggedIn = "1";
                UserDataLogin.UserID = dr["user_id"].ToString();
                Form1 frm1 = new Form1();
                frm1.Refresh();
                frm1.Validate();
                frm1.Refresh();
                this.Close();
            } else
            {
                MessageBox.Show("Brugernavn/Adgangskode findes ikke!", "Login Information");
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            string user = Username.Text;
            string pass = Password.Text;
            if(user == "" || pass == "")
            {
                MessageBox.Show("Felterne skal udfyldes", "Login Information");
            }
            _CheckLogin(user, pass);
           
        }
    }
}

også har jeg min classe fil som hedder UserDataLogin.cs som er den del der skulle gemme dataen i en variabel som så skulle kunne hentes ind i min main form automatisk. men virker ikke. Dataen bliver gemt men kan bare ikke få den frem i min main form. ved ikke hvad jeg har gjort forkert.

UserDataLogin.cs koden kommer her.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Hansen_Net
{
    class UserDataLogin
    {
        static string nm, add;

        public static string loggedIn
        {
            get
            {
                return nm;
            }
            set
            {
                nm = value;
            }
        }

        public static string UserID
        {
            get
            {
                return add;
            }
            set
            {
                add = value;
            }
        }
    }
}

Jeg håber meget i kan hjælpe mig så jeg kan få det til at virke. For kan ikke gennemskue hvad jeg skal gøre for at det vil. Men kort fortalt så de værdier som bliver gemt i UserDataLogin.cs er dem som jeg skal have ind i min Form1 efter en refresh så den ændre tekst i statuslinien og at den skriver værdierne i mine label 3 og 4. Så jeg kan se under mine test at det er overført som det skal.

Håber i kan forstå hvad jeg mener og hvis ikke vil jeg gerne prøve at forklare mig lidt bedre.

Venlig hilsen Delphiuser
Avatar billede arne_v Ekspert
12. september 2016 - 00:56 #1
Du gemmer vel informationen i Session objekt og henter det derfra igen??
Avatar billede arne_v Ekspert
12. september 2016 - 01:47 #2
Glem det - win forms ikke win forms.
Avatar billede arne_v Ekspert
12. september 2016 - 01:48 #3
En oplagt mulighed i en win form var at gemme oplsyningerne i et singleton objekt.
Avatar billede arne_v Ekspert
12. september 2016 - 01:51 #4
Hvis du vil fortsaette med static som i din kode saa kan du ogsaa det.

Du boer kunne referere til UserDataLogin.loggedIn  og UserDataLogin.UserID overalt i din kode.

Og varedierne boer blive der indtil de overskrives eller programmet afsluttes.
Avatar billede arne_v Ekspert
12. september 2016 - 01:52 #5
PS: hvorfor er loggedIn string og ikke bool?
Avatar billede arne_v Ekspert
12. september 2016 - 01:53 #6
PPS: du faar ikke lukket din database connection.
Avatar billede delphiuser Mester
12. september 2016 - 10:21 #7
Men hvorfor kan jeg så ikke tilgå de data som bliver gemt i min UserDataLogin.cs
Når jeg laver en MessageBos.show("UserID : " + UserDataLogin.UserID + " LoggedIn : " + UserDataLogin.loggedIn, "Login Information");

Hvor jeg kalder dataen fra UserDataLogin.cs som kommer de frem i min MessageBox.
Men der kommer ikke noget frem i min Main Form. Forstår det ikke
Avatar billede delphiuser Mester
12. september 2016 - 10:29 #8
Skal lige siges at jeg har lavet den der MessageBox inden jeg lukker min login.cs
og som vist kalder jeg dataerne fra min UserDataLogin.cs og de bliver vist. Men der sker bare intet i min mainform. hvilket egentlig undrer mig rigtig meget...
Avatar billede Syska Mester
12. september 2016 - 10:44 #9
Der er noget kode du ikke viser os ...

Kan du ikke poste det hele ... der er noget som ikke stemmer.

Static er static ... så sætter du den værdi et sted, så er den det også det andet sted.

Hvordan ser din MainForm ud?

Hvad sker der når du attacher en debugger til koden og stepper igennem det hele? Sker der så det forventede?
Avatar billede delphiuser Mester
12. september 2016 - 10:56 #10
Du kan se min main form i starten af spørgsmålet. der har jeg postet alt min kode.
Avatar billede delphiuser Mester
12. september 2016 - 10:57 #11
Min main form - Form1.cs ser således ud.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Hansen_Net
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            if (UserDataLogin.loggedIn == "1")
            {
                label3.Text = UserDataLogin.loggedIn;
                label4.Text = UserDataLogin.UserID;
                toolStripStatusLabel1.Text = "Du er logget ind...";
            }
            else
            {
                label3.Text = UserDataLogin.loggedIn;
                label4.Text = UserDataLogin.UserID;
                toolStripStatusLabel1.Text = "Du er ikke logget ind...";
            }
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            label3.Text = "";
            label4.Text = "";         
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            login frm2 = new login();
                frm2.Show();
        }
    }
}
Avatar billede delphiuser Mester
12. september 2016 - 10:58 #12
Hvordan attacher jeg en debugger til koden? Har jeg ikke prøvet før
Avatar billede Syska Mester
13. september 2016 - 18:46 #13
Ahh, nu kan jeg se dit problem.

Det er fordi på din MainForm som bliver kaldt først, der assigner du de værdier din din UserDataLogin har oprindeligt ... du opdatere dem så i din anden dialog, men det ændre jo ikke at du stadig har kopieret dine oprindelige værdier over og dermed viser brugeren noget helt andet.

Nu er det ved at være 10 år siden jeg har lavet Win Forms sidst ... men du burde kunne sende din MainForm  med over til din login og dermed opdatere din MainForm

Du kan lave en metode på din MainForm som du så kan kalde fra den Login form.

Giver det mening?
Avatar billede delphiuser Mester
14. september 2016 - 16:36 #14
Jeg har fundet en midlertidig løsning som ser sådan her ud på min MainForm.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using MySql.Data.MySqlClient;

namespace Hansen_Net
{
    public partial class Form1 : Form
    {

        //private string _con = "server=localhost;database=hansen_net;userid=hansen_net;password=17012005;";

        public Form1()
        {
            InitializeComponent();
        }

        private void toolStripButton1_Click(object sender, EventArgs e)
        {
            Form2 login = new Form2();
            login.Show();
            this.Hide();
            UserDataLogin.UserID = null;
            UserDataLogin.Username = null;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            this.Hide();
            Form2 login = new Form2();
            if (login.ShowDialog() == DialogResult.OK)
            {
                this.Show();
                toolStripLabel2.Text = UserDataLogin.Username;
                toolStripStatusLabel1.Text = "Du er logget ind...";
            }
            else if(login.ShowDialog() == DialogResult.Yes)
            {
                Form3 pass = new Form3();
                pass.Show();
                this.Hide();
            }
            else
            {
                Application.Exit();
            }
        }     
    }
}
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

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