如何在窗体中引用类属性实现输入验证?
如何用Worker类属性替代主窗口的验证逻辑?
我已经在Worker类中实现了带验证的读写属性,现在想把主窗口里的验证逻辑替换成调用这些类属性的方式,同时保留原else语句里的业务代码,请问主窗口的判断语句该怎么改?
Worker类原有属性代码
//Validates if anything has been entered for name internal string workName { get { return Name; } set { // 注意:原代码变量名错误,需将workerName改为value,否则验证逻辑无效 if (string.IsNullOrEmpty(value)) MessageBox.Show("You must enter something for name.", "ERROR", MessageBoxButton.OK, MessageBoxImage.Error); else Name = value; } } //Validates range and returns the work messages for calculation internal int workMessages { get { return Messages; } set { // 注意:原代码变量名错误,需将messagesSent改为value,否则验证逻辑无效 if (value <= 0) throw new ArgumentOutOfRangeException("You must enter a number greater than 0."); else Messages = value; } }
主窗口原有验证代码
private void btnCalculate_Click(object sender, RoutedEventArgs e) { string strName = txtName.Text.Trim(); int intMessages; if (string.IsNullOrEmpty(strName)) { MessageBox.Show("You must enter something for name.", "ERROR", MessageBoxButton.OK, MessageBoxImage.Error); return; } if (!int.TryParse(txtMessages.Text.Trim(), out intMessages)|| intMessages < 0){ MessageBox.Show("You must enter a number greater than 0 for messages sent.","ERROR", MessageBoxButton.OK, MessageBoxImage.Error); return; } else { //Increment each time a worker is submitted Worker.totalWorkers++; //Add and store each time messages sent is valid int totalMessages = int.Parse(txtMessages.Text.Trim()); Worker.totalMessages += totalMessages; } }
修改后的主窗口代码
private void btnCalculate_Click(object sender, RoutedEventArgs e) { string strName = txtName.Text.Trim(); int intMessages; // 创建Worker实例用于调用类属性 Worker worker = new Worker(); // 调用workName属性完成姓名验证,属性内部会自动弹出错误提示 worker.workName = strName; // 若姓名未通过验证,直接终止后续逻辑 if (string.IsNullOrEmpty(worker.workName)) return; // 先做输入格式验证(确保是有效数字) if (!int.TryParse(txtMessages.Text.Trim(), out intMessages)) { MessageBox.Show("You must enter a valid number for messages sent.", "ERROR", MessageBoxButton.OK, MessageBoxImage.Error); return; } // 调用workMessages属性完成范围验证,捕获属性抛出的异常并弹出提示 try { worker.workMessages = intMessages; } catch (ArgumentOutOfRangeException ex) { MessageBox.Show(ex.Message, "ERROR", MessageBoxButton.OK, MessageBoxImage.Error); return; } // 所有验证通过后,执行原else块中的业务代码 Worker.totalWorkers++; Worker.totalMessages += intMessages; }
关键说明
- 先修正Worker类属性中的变量名错误:将
workerName和messagesSent改为value,否则验证逻辑完全失效。 - 姓名验证直接通过给
workName赋值触发,属性内部会处理空值提示,后续通过判断属性返回值是否为空决定是否继续执行。 - 消息数的格式验证仍需在主窗口完成(确保输入是有效数字),范围验证交给
workMessages属性,通过捕获异常处理错误提示。 - 原else块中的业务代码完整保留,仅在所有验证通过后执行。
内容的提问来源于stack exchange,提问作者OGanunobyfan1629
相关产品推荐
相关产品推荐

