C# WinForms登录验证:实现3次尝试失败后关闭程序
解决C# WinForms登录3次尝试限制的问题
你的核心问题是把尝试次数的计数逻辑放在了遍历账户的foreach循环内部,导致每检查一个账户就会累加一次尝试次数(比如文件里有8个账户,一次错误登录就会触发8次计数),而正确的逻辑应该是每次点击登录按钮算一次尝试,和文件中账户数量无关。
正确实现步骤
- 在窗体类中定义一个类级别的变量,用来记录登录尝试次数,初始值为0。
- 在登录按钮的点击事件中,先读取文件并遍历账户信息完成验证,遍历结束后再根据验证结果更新尝试次数并给出对应提示。
示例代码
// 窗体类级别变量,记录登录尝试次数 private int loginAttempts = 0; private void btnLogin_Click(object sender, EventArgs e) { // 获取用户输入的账号密码 string inputUser = txtUsername.Text.Trim(); string inputPwd = txtPassword.Text.Trim(); bool isAuthenticated = false; // 读取文件中的账户信息 string[] lines = File.ReadAllLines("accounts.txt"); foreach (string line in lines) { string[] account = line.Split('|'); // 假设文件格式为「用户名|密码」 if (account.Length == 2 && account[0] == inputUser && account[1] == inputPwd) { isAuthenticated = true; break; // 找到匹配账户,直接跳出循环 } } // 根据验证结果处理逻辑 if (isAuthenticated) { // 登录成功,重置尝试次数,执行后续操作(如打开主窗体) loginAttempts = 0; MessageBox.Show("登录成功!"); // new MainForm().Show(); // this.Hide(); } else { loginAttempts++; switch (loginAttempts) { case 1: MessageBox.Show("错误:还有2次尝试机会"); break; case 2: MessageBox.Show("错误:还有1次尝试机会"); break; case 3: MessageBox.Show("错误:尝试次数过多"); this.Close(); break; } } }
关键说明
- 尝试次数变量
loginAttempts是窗体类成员,仅在每次登录验证失败后累加一次,完全独立于账户遍历过程。 foreach循环只负责完成账号密码的匹配检查,验证完成后统一处理尝试次数逻辑,避免了循环内计数导致的次数异常。- 登录成功后重置尝试次数,防止用户后续再次登录失败时延续之前的错误计数。
内容的提问来源于stack exchange,提问作者Hassan Ali
相关产品推荐
相关产品推荐

