You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何为不同按钮复用同一文本框输入?登出按钮异常排查

问题诊断与修复

嘿,我一眼就发现你登出按钮失效的核心问题啦——是个超容易犯的拼写错误!除此之外还有几个小细节会影响功能完整性,我帮你一步步梳理:

1. 直接导致登出失效的拼写错误

在你的登出按钮代码里,判断姓名的条件写成了if (name == "Danel"),但正确的姓名是"Daniel"(少了一个字母i)!这就导致哪怕你输入了正确的姓名,代码也不会触发登出逻辑。

2. 隐藏的逻辑问题

除了拼写错误,还有两个影响功能的小问题:

  • 每次点击按钮都新建一个Employee实例,登录和登出操作的是完全不同的对象,starttotal_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.

火山引擎 最新活动