C#如何在中间层类中抛出异常时获得控件焦点

时间:2017-03-11 12:22:53

标签: c#

我正在开发一个Windows Forms应用程序,其中包含许多必须手动输入的文本和组合框。因此,如果特定控件为空,则会进行大量检查。我想在我的UI中阅读所有验证并将它们移到中间层。这很好,因为UI现在可以免费验证,并且会按预期触发异常,但现在我无法知道哪个控件会导致异常触发。嗯,我可以,但不是没有干预我的UI,我显然不想要,因为这将使中间层验证不必要,因为我可以完全在UI中完成。所以,简而言之,我想要实现的是:如果验证被触发,我想将焦点设置为导致异常的控件,而不需要在UI中进行焦点硬设置。这可能吗?如果没有,最好的解决方案是什么?任何帮助表示赞赏。

我创建了一个简单的例子:

private void btnConfirm_Click(object sender, EventArgs e)
{
    try
    {
            Customer.CustomerTN = txtCustomerTN.Text;
            Customer.CustomerName = txtCustomerName.Text; 
            Customer.CustomerPhone = txtCustomerPhone.Text;

        MessageBox.Show("Customer TN: " + Customer.CustomerTN + 
                        Environment.NewLine +
                        "Customer Name: " + Customer.CustomerName + 
                        Environment.NewLine +
                        "Customer Phone: " + Customer.CustomerPhone);
   }
   catch (Exception ex)
   {
       MessageBox.Show(ex.Message);
       return;
   }

} //Middle Layer Class public class Customer { private static string customerTN; private static string customerName; private static string customerPhone;

public static string CustomerTN { get { return customerTN; } set { if (value.Length == 0) { throw new Exception("Enter Customer TN..."); } else { customerTN = value; } } } public static string CustomerName { get { return customerName; } set { if (value.Length == 0) { throw new Exception("Enter Customer Name..."); } else { customerName = value; } } } public static string CustomerPhone { get { return customerPhone; } set { if (value.Length == 0) { throw new Exception("Enter Customer Phone..."); } else { customerPhone = value; } } } }

1 个答案:

答案 0 :(得分:1)

您可以创建Validation类的层次结构。每个Validation类都有list个控件来验证。验证发生时,如果控件不符合规则,您可以通过显示消息并将焦点放在该控件上来中止验证,例如:

public abstract class ControlValidator<T> where T : Control
{
     protected List<T> ControlsToValidate;

     public ControlValidator(IEnumerable<T> controls)
     {
          this.ControlsToValidate = new List<T>(controls);
     }

     public abstract bool ValidateControls();
}

然后,如果你想要一个文本框验证器,你可以创建一个验证器,如:

public class TextBoxValidator : ControlValidator<TextBox>
{
     public TextBoxValidator(IEnumerable<TextBox> controls) : base(controls)
     {}

     public override bool ValidateControls()
     {
          foreach(TextBox tb in ControlsToValidate)
          {
              if (tb.Text == "") // This validates the text cannot be empty
              {
                  MessageBox.Show("Text cannot be empty");
                  tb.Focus();
                  return false;
              }
          }
          return True;
     }
}

然后,您将创建一个验证程序列表来存储应用程序的所有验证程序:

 List<ControlValidator> validators = ...

要验证您的所有控件,您可以执行以下操作:

 foreach(var validator in validators)
 {
     if (!validator.ValidateControls())
         break;
 }

一旦发现至少有一个控件未成功验证,foreach就会被中断。希望它有所帮助。