C# Anmeldeformular dann alle freischalten

coulio

Cadet 2nd Year
Registriert
Juni 2014
Beiträge
31
Hallo Leute,
ich habe ein kleines Programm geschrieben und alles funktioniert super.
jetzt versuche ich ein Anmeldeformular zu implementieren, damit nur Befugnisse Leute mit dem Programm arbeiten dürfen.

Program.cs

Code:
 static class Program
    {
        public static frmMain frm = new frmMain();

        [STAThread]

        static void Main()

        {
            Application.Run(frm);
        }

    }

mein Main hat folgende Code
Code:
 private void frmMain_Load(object sender, EventArgs e)

        {

            MenuStrip mnuMain = new MenuStrip();
            ToolStripMenuItem mnuAnmelden = new ToolStripMenuItem();
            ToolStripMenuItem mnuLaden = new ToolStripMenuItem();
            usw...

Bei der Aufbau meines Untermenü habe ich alles anders definiert. Bis auf die Anmeldung werden alle erst sichtbar wenn die Anmeldung richtig ist, zum Beispiel:

Code:
mnuAnmelden.Name = "mnuAnmelden";
mnuAnmelden.Text = "Anmelden";
mnuAnmelden.Click += newEventHandler(anmeldung);

....

....

mnuLaden.Enabled = false;

Dann musste ich das EventHandler definieren. Es sieht so aus:

Code:
  private void anmeldung(object sender, EventArgs e)
        {
            frmLogin frmMyLogin= new frmLogin();
            frmMyLogin.MdiParent = Program.frm;
            frmMyLogin.Show();
        }

Bis da ist kein Problem. Mein Problem ist die Anmeldung. Ein neues Form wird geöffnet und der Benutzer kann sich ruhig anmelden. Folgende Code habe ich dafür geschrieben:

Code:
private void btnanmeldung_Click(object sender, EventArgs e)
        {
            // verbinden zur Datenbank
            MySqlConnection con = new MySqlConnection(MyConnectionString); //MyConnectionString ist im Programm definiert
            con.Open();

            // Anfrage in der Datenbank
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = "SELECT COUNT(*) FROM user WHERE username = @Username AND password=@Pwd";
            cmd.Parameters.AddWithValue("@username", txbBemutzername.Text);
            cmd.Parameters.AddWithValue("@Pwd", txbPasswort.Text);
            cmd.Connection = con;

            // korrektes Auslesen des mit ExecuteScalar geholten Wertes
            int nUsersMatched = 0;
            object oResult = cmd.ExecuteScalar();
            if (oResult != null)
            {
                nUsersMatched = (int)oResult;
            }

            // Command & Connection schließen
            cmd.Dispose();
            con.Close();

            if (0 != nUsersMatched)

            {

            }

            else
            {
               Fehlermeldung
            }
        }
Meine Frage: Wie kann ich nachdem der User sich erfolgreich angemeldet hat, zu meinem Form Form.cs zurückkommen und alle andere Register sichtbar machen das heißt (Enabled = True) ?

Übr. Ich arbeite mit Window Form
 
Zuletzt bearbeitet:
Die beiden einfachsten Methoden wären:

http://stackoverflow.com/a/7541929/3355424
http://www.vcskicks.com/data-between-forms.php

Würde in deinem Fall zu Link#1 tendieren.
Beispiel:

Für dein ProgramForm:

Code:
private void button1_Click(object sender, EventArgs e)
{
    Form2 abc = new Form2();
    abc.Show();

    abc.FormClosed += abc_FormClosed;
}

void abc_FormClosed(object sender, FormClosedEventArgs e)
{
    Form2 abc = (Form2)sender;
    if (abc.login)
        label1.Text = "alles ok";
    else
        label1.Text = "nicht ok!";            
}

Für dein LoginForm

_login Variable muss natürlich vorhanden sein.

Code:
private void button1_Click(object sender, EventArgs e)
{
    Login = checkBox1.Checked;
    this.Close();
}

public bool Login
{
    get
    {
        return _login;
    }
    set
    {
        _login = value;
    }
}

Das hab ich gerade nur so fix aus dem Stand geschrieben, ich hafte nicht für Schäden :D
 
Zuletzt bearbeitet:
danke, ich versuche es, dann melde mich wieder. Danke schon mal
Ergänzung ()

Habe daraus folgendes versucht:

Im Form Anmeldung.cs:
Code:
 public bool authentifizierung()
        {
            // verbinden zur Datenbank
            MySqlConnection conn = new MySqlConnection(MyConnectionString);
            conn.Open();
            
            // Anfrage in der Datenbank
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = "SELECT COUNT(*) FROM user WHERE username = @username AND passwort=@Pwd";
            cmd.Parameters.AddWithValue("@username", txbBemutzername.Text);
            cmd.Parameters.AddWithValue("@Pwd", txbPasswort.Text);
            cmd.Connection = conn;
            Int32 count = Convert.ToInt32(cmd.ExecuteScalar());

            // Command & Connection schließen
            cmd.Dispose();
            conn.Close();

            if (count == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
            
        }


Code:
 private void btnAnmeldung_Click(object sender, EventArgs e)
        {
            login = CheckBox.Checked;  //Der wird nicht erkannt
            this.Close();
         
        }

im Main Form (Form1.cs)

Code:
 private void anmeldung(object sender, EventArgs e)
        {
           
            //Prozedur

            Anmeldung MyAnmeldung = new Anmeldung();
            MyAnmeldung.MdiParent = Program.frmMyMain;
            MyAnmeldung.Show();
            
            MyAnmeldung.FormClosed += login_FormClosed;
        }

        void login_FormClosed(object sender, FormClosedEventArgs e)
        {
            Anmeldung MyAnmeldung = (Anmeldung)sender;
            if (MyAnmeldung.login)
            {
               this.MainMenuStrip.Items[1].Enabled = true;
               this.MainMenuStrip.Items[2].Enabled = true;
               this.MainMenuStrip.Items[3].Enabled = true;
            }
            else
            {
                MessageBox.Show("Fehler");
            }
            
        }


Folgende fehler bekomme ich:


Fehler 1: "authentifizierung" ist "Methodengruppe", daher ist die Zuordnung nicht möglich.
Fehler 2: Für das nicht statische Feld, die Methode oder die Eigenschaft "System.Windows.Forms.CheckBox.Checked.get" ist ein Objektverweis erforderlich.
 
Zuletzt bearbeitet:
coulio schrieb:
Fehler 1: "authentifizierung" ist "Methodengruppe", daher ist die Zuordnung nicht möglich.
Du versuchst (irgendwo) der Methode authentifizierung etwas zuzuordnen wie bei einer Variable.

coulio schrieb:
Für das nicht statische Feld, die Methode oder die Eigenschaft "System.Windows.Forms.CheckBox.Checked.get" ist ein Objektverweis erforderlich.
Du greifst auf die Klasse Checkbox anstatt auf die Instanz derselben zu.
 
was meinst du mit _Login Property?
das was ich unter Authentifizierung definiert habe ?
 
Okay von Anfang:

In dem HauptFormular hast du soweit alles richtig.
In deinem ProgramFormular, sind noch ein paar Sachen die nicht stimmen.

Zuerst brauchst du die Variable in der du das Ergebnis speicherst.
Das ist die Variable:
Code:
bool _login

Nun wird in der Ergebnisauswertung (deine If-Anweisung), mit dem Property ("login") die die Variable verwaltet:
Property "Login":

Code:
public bool Login
{
    get
    {
        return _login;
    }
    set
    {
        _login = value;
    }
}

////////////////////////////////////////
(Property bedeutet Eigenschaft, wenn du zB. ein Formular erstellst kannst du über die Eigenschaften Height und Width die Größe ändern.
Beispiel:
Code:
Form2 abc = new Form2();
    abc.Height = 123;
////////////////////////////////////////


Nun setzt du die Property in der If-Anweisung ein:

Code:
this.Login = false
(für den Fall das keine Übereinstimmungen gefunden wurden)

Nun ist die Variable gespeichert und nun kann über deinen Button "btnAnmeldung_Click" das Formular geschlossen werden:

Code:
private void btnAnmeldung_Click(object sender, EventArgs e)
        {
            this.Close();         
        }

Dadurch das das Formular geschlossen wird, wird obriges Event ("MyAnmeldung.FormClosed") in deinem HauptFormular ausgelöst,
welches dann "login_FormClosed" startet.

"login = CheckBox.Checked;"
Dies war ja auch nur eine Box die ich in meinem Beispiel benutzt habe um die Boolvariable einzugeben und dann per Button zu übergeben.
 
Zuletzt bearbeitet:
Shio schrieb:
Das ist die globale Variable:
Code:
bool _login
An der Variable ist nichts global, außerdem sollte die Sichtbarkeit private sein. Zum externen Zugriff ist ja die Property da (Properties schreibt man übrigens nach gängiger Konvention mit einem großen Anfangsbuchstaben, lokale Variablen mit einem kleinen).
 
Shio schrieb:
Okay von Anfang:

In dem HauptFormular hast du soweit alles richtig.
In deinem ProgramFormular, sind noch ein paar Sachen die nicht stimmen.

Zuerst brauchst du die Variable in der du das Ergebnis speicherst.
Das ist die globale Variable:
Code:
bool _login

Nun wird in der Ergebnisauswertung (deine If-Anweisung), mit dem Property ("login") die die Variable verwaltet:
Property "login":

Code:
public bool login
{
    get
    {
        return _login;
    }
    set
    {
        _login = value;
    }
}
also in meiner Authentifizierung anstatt diese if-Anweisung:
Code:
if (count == 0)
            {
                return false;
            }
            else
            {
                return true;
            }
[CODE]

[CODE]login
?

Was mit mit der Methode this.Login?

wo soll er hin?

tut mir für die doofe Fragen. möchte verstehen
 
schreib einfach return (count != 0)
 
Zuletzt bearbeitet:
Der Post vor deinem edit hat mir besser gefallen. Ich möchte auch immer schreien, wenn ich sowas lese XD
 
In deiner auth Methode (this, habe ich jetzt nur der Verständlichkeit halber hinzugefügt):
Code:
            if (count == 0)
            {
                this.Login = false;
            }
            else
            {
                this.Login = true;
            }

Die Property (unten) fügst du unter deiner auth. Methode ein, aber noch in der Klasse des Formulars.
Code:
public bool Login
{
    get
    {
        return _login;
    }
    set
    {
        _login = value;
    }
}

Zudem gibts du der Klasse noch die Variable

Code:
private bool _login


@Darlis
Wie ich schon sagte, war das nur Code den ich kurz in VS eingetippt habe.
Da schreibe ich meist so wie ich gerade Laune habe :P

Bin heut bisschen voreilig mit dem schreiben, da passieren auch mal Fehler .. ^^

@Darlis und aw48
Es steht euch frei auch komplette Antworten zu geben anstatt nur Code Snippets :)
 
Zuletzt bearbeitet:
Ich denke, jetzt verstehe ich viel besser. Komisch dass ich sehr viel Zeit bei einer so Kleinigkeit bleibe als sonst. :(


Habe soweit alles verstanden und geändert.

Code:
 public bool authentifizierung()
        {
            // verbinden zur Datenbank
            MySqlConnection conn = new MySqlConnection(MyConnectionString);
            conn.Open();
            
            // Anfrage in der Datenbank
            MySqlCommand cmd = new MySqlCommand();
            cmd.CommandText = "SELECT COUNT(*) FROM user WHERE username = @username AND passwort=@Pwd";
            cmd.Parameters.AddWithValue("@username", txbBenutzername.Text);
            cmd.Parameters.AddWithValue("@Pwd", txbPasswort.Text);
            cmd.Connection = conn;
            Int32 count = Convert.ToInt32(cmd.ExecuteScalar());

            // Command & Connection schließen
            cmd.Dispose();
            conn.Close();

            if (count == 0)
            {
                this.login = false;
            }
            else
            {
                this.login = true;
            }
        }

es kommt allerdings noch einen Fehler:
Fehler 3 "french.frmAnmeldung.authentifizierung()": Nicht alle Codepfade geben einen Wert zurück.
Dieser Fehler verweis auf der Methode authentifizierung()
Was könnte das bedeutet?
 
public bool authentifizierung()
{..}

Du hast festgelegt, dass deine Methode einen bool-Wert zurückgibt ^^
 
Shio schrieb:
@Darlis und aw48
Es steht euch frei auch komplette Antworten zu geben anstatt nur Code Snippets :)
Stimmt, wir sollten den Hilfesuchenden immer kompletten und funktionierenden Code liefern, den sie nur noch guttenbergen müssen. Wo kommen wir denn da hin, wenn diese auch noch verstehen würden, was sie da kopieren und womöglich noch selbst auf die Lösung kommen? Die kommen doch nie wieder! Also nur her mit euren Hausaufgaben :)
 
Darlis schrieb:
Stimmt, wir sollten den Hilfesuchenden immer kompletten und funktionierenden Code liefern, den sie nur noch guttenbergen müssen. Wo kommen wir denn da hin, wenn diese auch noch verstehen würden, was sie da kopieren und womöglich noch selbst auf die Lösung kommen? Die kommen doch nie wieder! Also nur her mit euren Hausaufgaben :)

Wenn du schon so daran gehst kannst du solchen Threads auch gerne fernbleiben :).
Man könnte es auch einfach gut genug erklären, womit der jeweilige Fragensteller dann die Möglichkeit hat das zu verstehen.
Inwiefern coulio das nun verstanden hat weiß ich nicht, wenn er noch weitere Fragen hat, werde ich die, soweit es mir möglich ist, beantworten.
 
Danke für alles,

Ja Stimmt auch dass wir manchmal ausführliche Antwort brauchen. Aber ganz ehrlich, das hilft uns besser zu verstehen.
Schließlich versuchen wir eigene Code zu schreiben, um zu verstehen.

Shio schrieb:
Man könnte es auch einfach gut genug erklären, womit der jeweilige Fragensteller dann die Möglichkeit hat das zu verstehen.
Inwiefern coulio das nun verstanden hat weiß ich nicht, wenn er noch weitere Fragen hat, werde ich die, soweit es mir möglich ist, beantworten.

Danke
 
coulio schrieb:
Danke für alles,

Ja Stimmt auch dass wir manchmal ausführliche Antwort brauchen. Aber ganz ehrlich, das hilft uns besser zu verstehen.
Schließlich versuchen wir eigene Code zu schreiben, um zu verstehen.

Gerne.
War bei mir vor paar Monaten auch nicht anders wo ich mit C# angefangen habe.
Bin auch eher der Typ Learing by Doing ;)
 
Das Programm zeigt mir keinen Fehler aber die Anmeldung erfolgt auch nicht. Es kommt immer nur die Fehlermeldung.
Nach Überlegung denke ich, ich weiss warum. Sobald der User auf anmelden klickt, wird einfach dieses Form geschlossen. Der btnAnmeldung_Click macht nichts anderes.
Code:
private void btnAnmeldung_Click(object sender, EventArgs e)
        {
            this.Close(); 
        }
Aso ich schäme mich jetzt ein bisschen aber sonst werde ich keine Antwort bekommen.
 
Shio schrieb:
Man könnte es auch einfach gut genug erklären, womit der jeweilige Fragensteller dann die Möglichkeit hat das zu verstehen.
Richtig, man kann es erklären oder direkt Code posten. Letzteres hat aber zur Folge, dass der TE dich dann mit den Fehlermeldungen, die dein Code produziert hat, konfrontiert, ohne selbst mal darüber nachzudenken (meinetwegen auch googeln). Du musst ihm dann den Code solange debuggen, bis er funktioniert oder der TE es verstanden hat.

Ich vertrete ja die Ansicht, dem Hilfesuchenden nur genügen Hinweise zu geben, dass er das Problem selbst lösen kann. Sonst guckt er bei der Klausur blöd aus der Wäsche, da er dort i.d.R. kein Internetzugang hat. Und da der TE von "wir" spricht, handelt es sich höchstwahrscheinlich tatsächlich um eine Hausaufgabe, und dafür gibt es hier Regeln.
 
Zurück
Oben