点击按钮弹出新窗体时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()); }
额外优化建议
- 解决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); // 其余参数按此方式添加
- 修正验证逻辑缺陷:当前
btn_Save中的else仅对应最后一个if(手机号验证),会导致只要手机号合法就执行插入,忽略邮箱和邮编的错误。调整为:
if (!isEmailValid || !isPostValid || !isPhoneValid) { if (!isEmailValid) MessageBox.Show("请输入有效的邮箱"); if (!isPostValid) MessageBox.Show("请输入有效的邮编"); if (!isPhoneValid) MessageBox.Show("请输入有效的手机号"); } else { // 执行数据库插入和窗体跳转逻辑 }
- 添加空值避免异常:
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("该月份没有这么多天,请重新选择"); } }
- 删除冗余代码:
cmd.Clone()是无效操作,直接删除即可。
内容的提问来源于stack exchange,提问作者lxsus
相关产品推荐
相关产品推荐

