2016-11-30 3 views
-2

Ich arbeite in diesem Programm für 3 Stunden, aber ich weiß nicht, wo ich falsch mache. Wenn Sie mir helfen könnten, ich schätze es wirklich. Das Problem ist, wenn ich das Kennwort eintrage. Es sagt, dass es falsches Kennwort ist, selbst wenn ich das richtige Kennwort gebe, erlaubt es mir nicht, es erneut zu versuchen. Das Programm soll dem Benutzer erlauben, 3mal zu versuchen, wenn die Benutzer falsches Kennwort setzen nach dem dritten Mal muss das Programm schließen.Wie kann man das Passwort dreimal in C# eingeben?

public partial class UserAndPin : Window 
{ 
    public UserAndPin() 
    { 
     InitializeComponent(); 
    } 

    private void btnOK_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      StreamReader sr = new StreamReader("Customer.txt"); 

      short attempts = 0; 
      string line; 

      while ((line = sr.ReadLine()) != null) 
      { 
       string[] lineArray = line.Split(';'); 
       if (lineArray[0] == txtName.Text & lineArray[1] == pbPassword.Password) 
       { 
        MainWindow mainWindow = new MainWindow(); 
        this.Hide(); 
        mainWindow.ShowDialog(); 
        //return; 
       } 
       else 
       { 
        attempts++; 
        if (attempts < 3) 
        { 
         MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more");              
        } 
        if (attempts == 3) 
        { 
         MessageBox.Show("Please try again later"); 
         this.Close(); 
        }       
       }      
      } 
      sr.Close(); 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 
} 

}

+2

Lernen Sie, Ihren Debugger zu verwenden! [Wie kleine Programme zu debuggen] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/) –

+0

@Gurwinder Können Sie mir ein bisschen mehr erklären, was Sie bitte meinen? – Shahzada

+1

@Gurwinder Was ist falsch mit '==' zu Strings zu vergleichen? –

Antwort

0
Dictionary<string, string> loginInfo; 
short attempts = 0; 

public UserAndPin() 
{ 
    InitializeComponent(); 

    // Load the file to the dictionary 
    loginInfo = File.ReadAllLines("Customer.txt") 
     .Select(i => i.Split(';')) // Lines format: Username;Password 
     .ToDictionary(i => i[0].ToLower(), i => i[1]); // Username is the key of the dictionary 

} 

private void btnOK_Click(object sender, RoutedEventArgs e) 
{  
    var userId = txtName.Text.ToLower(); // Username ignore case 
    var password = pbPassword.Password; 

    if (loginInfo.ContainsKey(userId) && loginInfo[userId] == password) 
    { 
     // login success, show main window 
     MainWindow mainWindow = new MainWindow(); 
     this.Hide(); 
     mainWindow.ShowDialog(); 
     return; 
    } 

    // login fail, increment the count only 
    attempt++; 

    if (attempts < 3) 
    { 
     MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more");              
    } 
    if (attempts == 3) 
    { 
     MessageBox.Show("Please try again later"); 
     this.Close(); 
    } 

} 
+1

Das 'while' macht keinen Sinn. – Kinetic

+0

@Kinetic Ja, Sie haben Recht – Eric

1

Da Sie die short attempts = 0; innerhalb der btnOK_Click jedes Mal deklarieren klicken Sie auf die Schaltfläche die attempts initiieren 0 zu sein, während Sie es wollen um 1 jedes Mal erhöht werden, der Benutzer klickt auf die Schaltfläche, die Sie so müssen sie erklären, global wie

public partial class UserAndPin : Window 
{ 
    short attempts; 
    public UserAndPin() 
    { 
     InitializeComponent(); 
     attempts = 0; 
    } 

attempts++; sollte unterhalb der while-Schleife sein, denn wenn man 10 Benutzerinformationen in der Datei wird sie hinzufügen oder Erhöhen Sie die attempt jedes Mal, wenn die Bedingung nicht übereinstimmt.

Nun, wenn der Benutzername und das Passwort doesnt Spiel aus der Datei lesen Sie. was offensichtlich nicht passt, wenn die Benutzerinformation an der 10. Position oder Zeile ist, wird es Ihnen Nachrichtenbox für 9 mal geben. Ein weiteres Problem ist Logical AND operator es ist && und nicht & und als würde es passen, so dass die richtige Art und Weise

public partial class UserAndPin : Window 
{ 
    short attempts; 
    public UserAndPin() 
    { 
     InitializeComponent(); 
     attempts = 0; 
    } 

    private void btnOK_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      StreamReader sr = new StreamReader("Customer.txt"); 
      string line; 
      while ((line = sr.ReadLine()) != null) 
      { 
       string[] lineArray = line.Split(';'); 
       if (lineArray[0] == txtName.Text && lineArray[1] == pbPassword.Password) 
       { 
        MainWindow mainWindow = new MainWindow(); 
        this.Hide(); 
        mainWindow.ShowDialog(); 
        //return; 
       } 
      } 
      sr.Close(); 

      if (attempts < 3) 
      { 
       MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more"); 
      } 
      else 
      { 
       MessageBox.Show("Please try again later"); 
       this.Close(); 
      } 
      attempts++; //Since user has attempted it. 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 
} 
+1

Es gibt immer noch das Problem, dass 'Versuche' außerhalb der while erhöht werden sollten. – Kinetic

+0

Yup !! @Kinetic. Danke für den Haken –

+0

... und beide 'wenn' wo er' Versuche 'Wert überprüft, sollte nicht in der' while' sein. Aber das ist ziemlich nah. – Kinetic

1

sollten Sie sollten die Versuche "jede Authentifizierung erfolgreich initilize. Oder mehr als 3 mal in 3 Stunden.

Wenn Sie Erfolg bei 2 mal anmelden dann die Versuche '0

sein sollte Wenn das Projekt, das Sie über als 3 Stunden nach Login möglich verwirft, die Versuche' sollte auch auf 0

eingestellt werden
+0

Woher kommen die 3 Stunden? – Kinetic

1

Zuerst müssen Sie Ihre Datei lesen, um den Benutzernamen und das Passwort zu erhalten. Im Idealfall würden Sie dies nur einmal im Konstruktor tun.

Dann müssen Sie Ihren Zähler um eins erhöhen. Und dieser Zähler muss wie in anderen Antworten angegeben außerhalb des Click-Ereignishandlers angegeben werden.

Schließlich können Sie dann prüfen, ob der Benutzer/Passwort ein Spiel aus der Datei eingegeben. Wenn dies der Fall ist, können Sie Ihr Formular öffnen. Wenn nicht, zeigen Sie eines der Nachrichtenfelder an, abhängig davon, ob der Benutzer den dritten Versuch erreicht hat oder nicht.

public partial class UserAndPin : Window 
{ 
    short attempts; 

    public UserAndPin() 
    { 
     InitializeComponent(); 
     attempts = 0; 
    } 

    private void btnOK_Click(object sender, RoutedEventArgs e) 
    { 
     try 
     { 
      var users = File.ReadAllLines("Customer.txt") 
       .Select(line => new { login = line[0], password = line[1] }) 
       .ToList(); 

      attempts++; 

      if (users.Any(user => user.login == txtName.Text && user.password == pbPassword.Password)) 
      { 
       MainWindow mainWindow = new MainWindow(); 
       this.Hide(); 
       mainWindow.ShowDialog(); 
       return; 
      } 
      else 
      { 
       if (attempts < 3) 
       { 
        MessageBox.Show("The NAME or PIN is incorect, you have " + (3 - attempts) + " attemps more"); 
       } 
       if (attempts >= 3) 
       { 
        MessageBox.Show("Please try again later"); 
        this.Close(); 
       } 
      } 
     } 
     catch (Exception error) 
     { 
      MessageBox.Show(error.Message); 
     } 
    } 
} 
Verwandte Themen