You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮弹出新窗体时Windows Forms应用冻结的问题排查

问题分析与修复

核心冻结原因

程序卡死的直接原因是MakeBooking_Load方法中的无限循环:

// 原代码:缺少循环变量递增,永远不会退出循环
for (int y = 1900; y <= DateTime.Now.Year;)
{
    cmb_YYYY.Items.Add(y.ToString());
}

循环条件里没有y++,导致y始终停留在1900,永远满足y <= DateTime.Now.Year,UI线程被无限占用,程序彻底失去响应。

修复代码

把循环改为正常递增的形式:

for (int y = 1900; y <= DateTime.Now.Year; y++)
{
    cmb_YYYY.Items.Add(y.ToString());
}

额外优化建议

  1. 解决SQL注入风险:当前数据库插入用字符串拼接,极易被注入攻击,改用参数化查询:
// 参数化写法示例
SqlCommand cmd = new SqlCommand("INSERT INTO Customer (First_Name, Last_Name, Phone_Number, Email, Address_Line_1, Town, Postcode) VALUES (@FName, @LName, @Phone, @Email, @Addy1, @Town, @Postcode);", conn);
cmd.Parameters.AddWithValue("@FName", txt_F_Name.Text);
cmd.Parameters.AddWithValue("@LName", txt_L_Name.Text);
// 其余参数按此方式添加
  1. 修正验证逻辑缺陷:当前btn_Save中的else仅对应最后一个if(手机号验证),会导致只要手机号合法就执行插入,忽略邮箱和邮编的错误。调整为:
if (!isEmailValid || !isPostValid || !isPhoneValid)
{
    if (!isEmailValid) MessageBox.Show("请输入有效的邮箱");
    if (!isPostValid) MessageBox.Show("请输入有效的邮编");
    if (!isPhoneValid) MessageBox.Show("请输入有效的手机号");
}
else
{
    // 执行数据库插入和窗体跳转逻辑
}
  1. 添加空值避免异常:cmb_YYYY_Leave方法中未判断下拉框是否选中,直接转换会抛出异常,补充判断:
private void cmb_YYYY_Leave(object sender, EventArgs e)
{
    if (cmb_YYYY.SelectedItem == null || cmb_MM.SelectedItem == null || cmb_DD.SelectedItem == null)
        return;

    int year = Convert.ToInt32(cmb_YYYY.Text);
    int month = cmb_MM.SelectedIndex + 1;
    int day = DateTime.DaysInMonth(year, month);
    
    if (cmb_DD.SelectedIndex >= day)
    {
        MessageBox.Show("该月份没有这么多天,请重新选择");
    }
}
  1. 删除冗余代码:cmd.Clone()是无效操作,直接删除即可。

内容的提问来源于stack exchange,提问作者lxsus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 00:40:54