Anmeldeformular --- Dann alle Register sichtbar machen

lecoeur

Grünschnabel
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
            {
                MessageBox......
            }

        }


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) ?
 
Erstell die MenüItems schon im Designer, normal,
für MenüItems gibt es ein Ereignis (irgendwas mit Opening) was ausgelöst wird wenn die untermenüs sichtbar werden.

Dort würde ich einfach die Eigenschaft Enabled der Untermenüs auf true oder false setzen.
 
Was meinst du damit? Ich verstehe noch nicht :(
ich dachte, nachdem die Authentifizierung geprüft wird, sollte ich irgendwie zurück zu meinem Form.cs und dort alle sichtbar machen.

Code:
if (0 != nUsersMatched)
{         }

Kann ich schon von hier die Menuitems alle sichtbar machen? Wie?

Übr. Ich arbeite mit Window Form
 
Zuletzt bearbeitet:
habe folgendes versucht. Habe eine Funktion für die Anmeldung geschrieben:
Code:
public bool login()
        {
            // 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 user = @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)
            {
                return false;
            }
            else
            {
                return true;
            }
           
        }

dann

Code:
 private void btnanmeldung_Click(object sender, EventArgs e)
        {
            bool login = login();
            if (login == true)
            {
                frmMain frm = new frmMain();
               
                frm.MainMenuStrip.Items[1].Enabled = true;
                frm.MainMenuStrip.Items[2].Enabled = true;
                this.Close();
            }
            else
            {
                Fehlermeldung
            }
        }

dann erscheint diesen Fehler:

Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt.

Was soll ich da besser machen?
 
Du rufst doch dein Login Formular innerhalb deiner MainForm auf oder?
Die LoginForm musst nur zurück geben ob der Login erfolgreich war.

Code:
private bool loginValid;

private void btnanmeldung_Click(object sender, EventArgs e)
{
   using(LoginForm dlg=new LoginForm())
          loginValid=(dlg.ShowDialog(this)==DialogResult.OK;
}

private void meinMenu_DropDownOpening(object sender, EventArgs e)
{
   nochEinMenu.Enabled= loginValid;
}

so ungefähr
 
das sind 2 verschiedenen Formulare.

das Main Formular ist MDI Parent und ruft das Formular Anmeldung. eigentlich sollte dieses Formular Anmeldung seine Ergebnis zu dem Main zurückschicken, damit dieses die andere Menü buttons zulässt
 
wird das loginformular nach anmeldung geschlossen oder bleibt es immer sichtbar?

ansosnten könntest du eine eigenschaft im loginformular definieren welches zurück gibt ob der login erfolgreich war oder nicht.

dazu dann noch das FormClosed Ereignis der loginform in deiner mainform abonnieren,
dort im ereignis dann die eigenschaft abfragen und in einem privaten feld der mainform merken.

diese feld dann wie oben in meinem code gezeigt beim opening ereignis der menüitems abfragen
 
Zurück