patr96 Geschrieben 14. Februar 2020 Geschrieben 14. Februar 2020 Hallo, Ich habe noch eine Aufgabe, die ich noch für die Schule erledigen muss. Ich habe drei von vier Aufgaben erledigt. Den letzte Aufgabe habe ich leider noch nie gemacht. Ich hoffe, dass da jemand mir helfen kann. 4. Aufgabe: Wenn dreimal hintereinander ein falscher Benutzername oder ein falsches Passwort eingegeben wird, wird die GUI unter 4. durch eine Bezeichnung "lbl_code" und ein Textfeld "txt_code" ergänzt. Es ist nicht mehr möglich, den Benutzernamen und das Passwort einzugeben. Nach Eingabe des Codes "0815" zeigt die GUI wieder den Grundzustand an und die fehlgeschlagenen Versuche werden gelöscht. Hier ist meine Programm. namespace Projektarbeit_Pförtneranlage { public partial class FormLogin : Form { static int attempt = 3; public FormLogin() { InitializeComponent(); } //Verbindungszeichenfolge string cs = @"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\patri\Downloads\LoginApplicationSourceCode\LoginApplicationSourceCode\LoginApplication\LoginApplication\MyDatabase.mdf;Integrated Security=True;Connect Timeout=30;"; private void button2_Click(object sender, EventArgs e) { string username = txt_name.Text; string password = txt_pwd.Text; if (txt_name.Text == "" || txt_pwd.Text == "") { attempt = 0; MessageBox.Show("Bitte geben Sie Benutzername und Passwort ein!"); return; } else if ((attempt == 3) && (attempt > 0)) { lbl_versuch.Text = ("Sie haben nur noch " + Convert.ToString(attempt) + " Versuche."); --attempt; } else if ((attempt == 2) && (attempt > 0)) { lbl_versuch.Text = ("Sie haben nur noch " + Convert.ToString(attempt) + " Versuche."); --attempt; } else if ((attempt == 1) && (attempt > 0)) { lbl_versuch.Text = ("Sie haben nur noch " + Convert.ToString(attempt) + " Versuch."); --attempt; } try { //Erstellen Sie SqlConnection SqlConnection con = new SqlConnection(cs); SqlCommand cmd = new SqlCommand("Select * from tbl_Login where UserName=@username and Password=@password", con); cmd.Parameters.AddWithValue("@username", txt_name.Text); cmd.Parameters.AddWithValue("@password", txt_pwd.Text); con.Open(); SqlDataAdapter adapt = new SqlDataAdapter(cmd); DataSet ds = new DataSet(); adapt.Fill(ds); con.Close(); int count = ds.Tables[0].Rows.Count; //Wenn count gleich 1 ist, wird die Form frmMain angezeigt if (count == 1) { MessageBox.Show("Anmeldung erfolgreich!"); this.Hide(); FormGUI fm = new FormGUI(); fm.Show(); } else { MessageBox.Show("Login Failed!"); } } catch (Exception ex) { MessageBox.Show(ex.Message); } } private void button1_Click(object sender, EventArgs e) { this.Close(); } } } Zitieren
RipperFox Geschrieben 15. Februar 2020 Geschrieben 15. Februar 2020 Puh - das sieht chaotisch aus.. - Ist es gewollt, dass man die Anzahl Versuche durch weglassen von Name und Passwort zurücksetzen kann? - Die Anzahl der Versuche ist irrelevant, wenn man die korrekte Name/Passwort Kombi eingibt - deswegen sollte man die Versuche vielleicht nur anzeigen, wenn der Login fehlschlägt. - Die if else -Schlange (was ist bei 100 erlaubten Versuchen?) kann man zu einem if statement zusammenfassen, zudem ((attempt == 3) && (attempt > 0)) ist doppelt gemoppelt. Du solltest evtl. nur vergleichen, ob der aktuelle (fehlgeschlagene) Versuch unter der Anzahl maximaler Versuche liegt oder ob diese erreicht sind. Den ganzen Code in die button2_Click Methode zu quetschen ist extemst Spaghetti Zu deiner eigentlichen Frage: GUI-Elemente wie Label und Textboxen lassen sich z.B. mittels ihrer "Visible"-Eigenschaft anzeigen und verbergen sowie mittels der "Enabled"-Eigenschaft aktivieren und deaktivieren - Bsp: label1.Visible = true; textbox1.Enabled = false; Zitieren
patr96 Geschrieben 15. Februar 2020 Autor Geschrieben 15. Februar 2020 vor 6 Stunden schrieb RipperFox: - Die if else -Schlange (was ist bei 100 erlaubten Versuchen?) kann man zu einem if statement zusammenfassen, zudem ((attempt == 3) && (attempt > 0)) ist doppelt gemoppelt. Du solltest evtl. nur vergleichen, ob der aktuelle (fehlgeschlagene) Versuch unter der Anzahl maximaler Versuche liegt oder ob diese erreicht sind. Wie soll das denn gehen? Zitieren
Visar Geschrieben 15. Februar 2020 Geschrieben 15. Februar 2020 Der Code verwirrt mich minimal. Wäre es nicht einfacher attempt von 0 auf 3 hochzuzählen, statt attempt = 3 zu setzen und --attempt zu machen? Ich verstehe zwar, dass übrige Versuche angezeigt werden sollen, laut Aufgabe muss das aber nicht. 😄 Du deklarierst die Variablen username und password, benutzt sie aber nicht? 😕 username oder password nicht einzugeben setzt attempt zurück, statt als gültiger fehlgeschlagener Login zu zählen (attempt + 1). Beim dritten, fehlgeschlagenen Versuch werden Label- und Textfeld für den Code (lbl_code, txt_code) nicht eingeblendet und entsprechend erfolgt auch keine Verarbeitung des Codes 0815? Ein fehlgeschlagener Login-Versuch zählt attempt weder rauf noch runter, sondern erzeugt lediglich eine MessageBox? Ein erfolgreicher Login-Versuch setzt attempt nicht wieder auf 0? Zitieren
RipperFox Geschrieben 16. Februar 2020 Geschrieben 16. Februar 2020 vor 13 Stunden schrieb patr96: Wie soll das denn gehen? In deiner Bauart interessiert ja nur, ob man noch Versuche hat (attempt > 0 ) - somit brauchst du auch nur das abfragen. Außerdem fehlt die Behandlung des Falls 0 Versuche (attempt = 0) komplett und somit landet man bei dann immer im try-Block. Auch, wenn man Name und Passwort einmal leer gelassen hat, wird attempt aufd 0 gesetzt und somit das (unnötige wiederholte) "if else"-Gewurstel immer übersprungen. Das Dekrementieren von attempt / die Anzeige, dass der Login fehlgeschlagen ist sollte erst nach der Prüfung des Passworts kommen. So wie das ist ist das relativ seltsam - momentan wird bei dir attempt auch bei korrektem Passwort dekrementiert. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.