如何为不同按钮复用同一文本框输入?登出按钮异常排查
问题诊断与修复
嘿,我一眼就发现你登出按钮失效的核心问题啦——是个超容易犯的拼写错误!除此之外还有几个小细节会影响功能完整性,我帮你一步步梳理:
1. 直接导致登出失效的拼写错误
在你的登出按钮代码里,判断姓名的条件写成了if (name == "Danel"),但正确的姓名是"Daniel"(少了一个字母i)!这就导致哪怕你输入了正确的姓名,代码也不会触发登出逻辑。
2. 隐藏的逻辑问题
除了拼写错误,还有两个影响功能的小问题:
- 每次点击按钮都新建一个
Employee实例,登录和登出操作的是完全不同的对象,start、total_hours这些状态根本没法在登录和登出之间共享,工时计算肯定会出错。 - 如果用户还没登录就点登出,直接执行
end.Subtract(this.start)会抛出异常,得先检查登录状态。
修正后的完整代码
第一步:重构窗体按钮逻辑(复用Employee实例)
把Employee实例改成窗体类的成员变量,避免每次点击都新建对象:
// 在窗体类内部声明成员变量,保存当前登录的员工实例 private Employee _currentEmployee; // 登录按钮点击事件 public void button1_Click(object sender, EventArgs e) { try { int pin = int.Parse(textBox1.Text); string name = textBox3.Text; if (name == "Daniel") { _currentEmployee = new Employee("Daniel", 5741); _currentEmployee.OnSignIn(pin); } else { MessageBox.Show("未找到该员工!"); } } catch (FormatException) { MessageBox.Show("PIN码必须是数字!"); } } // 登出按钮点击事件(修复拼写错误+复用实例) public void button2_Click(object sender, EventArgs e) { if (_currentEmployee == null) { MessageBox.Show("请先登录!"); return; } try { int pin = int.Parse(textBox1.Text); string name = textBox3.Text; if (name == "Daniel") { // 这里修正了拼写错误 _currentEmployee.OnSignOut(pin); } else { MessageBox.Show("员工姓名不匹配!"); } } catch (FormatException) { MessageBox.Show("PIN码必须是数字!"); } }
第二步:完善Employee类的状态管理
给Employee类新增登录状态标记,避免未登录时执行错误逻辑:
public class Employee { private DateTime _signInTime; private double _totalWorkSeconds; private readonly int _pin; private readonly string _name; private bool _isSignedIn; // 标记当前是否已登录 public Employee(string name, int pin) { _name = name; _pin = pin; _isSignedIn = false; _totalWorkSeconds = 0; } public void OnSignIn(int inputPin) { if (_isSignedIn) { MessageBox.Show("你已经登录过了!"); return; } if (inputPin == _pin) { _signInTime = DateTime.Now; _isSignedIn = true; MessageBox.Show("You are logged in!"); } else { MessageBox.Show("Incorrect Pin"); } } public void OnSignOut(int inputPin) { if (!_isSignedIn) { MessageBox.Show("你还没有登录!"); return; } if (inputPin == _pin) { TimeSpan workDuration = DateTime.Now.Subtract(_signInTime); _totalWorkSeconds += workDuration.TotalSeconds; MessageBox.Show($"Logged Out! You have worked for {workDuration.TotalSeconds:F2} seconds for this session. You have worked {_totalWorkSeconds:F2} seconds in total."); _isSignedIn = false; } else { MessageBox.Show("Incorrect Pin"); } } }
关键修复点总结
- 修正登出按钮中姓名判断的拼写错误:
"Danel"→"Daniel" - 将
Employee实例改为窗体成员变量,保证登录和登出操作的是同一个对象,状态可以正确传递 - 新增登录状态检查,避免未登录时执行登出逻辑导致的异常
- 添加了输入格式校验,防止非数字PIN码引发崩溃
- 优化了工时计算的精度,用
TotalSeconds代替Seconds(后者只取整数秒,会丢失毫秒精度)
内容的提问来源于stack exchange,提问作者Daniel V.




