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

C# C如何在中间层类中抛出异常时获得控制焦点,c#,C#,我正在开发一个Windows窗体应用程序,它有很多文本和组合框,必须手动输入。因此,如果某个控件为空,则需要进行大量检查。我想读取UI中的所有验证,并将它们移动到中间层。这很好,因为UI现在是免验证的,异常按预期触发,但现在我不知道是哪个控件导致异常触发。嗯,我可以,但不能不干预我的UI,这显然是我不想要的,因为这会使中间层验证变得不必要,因为我可以完全在UI中进行。所以,简而言之,我想实现的是:如果触发了验证,我想将焦点设置为导致异常的控件,而不需要在UI中进行焦点硬设置。这可能吗?如果不是,

我正在开发一个Windows窗体应用程序,它有很多文本和组合框,必须手动输入。因此,如果某个控件为空,则需要进行大量检查。我想读取UI中的所有验证,并将它们移动到中间层。这很好,因为UI现在是免验证的,异常按预期触发,但现在我不知道是哪个控件导致异常触发。嗯,我可以,但不能不干预我的UI,这显然是我不想要的,因为这会使中间层验证变得不必要,因为我可以完全在UI中进行。所以,简而言之,我想实现的是:如果触发了验证,我想将焦点设置为导致异常的控件,而不需要在UI中进行焦点硬设置。这可能吗?如果不是,那么最好的解决方案是什么?谢谢你的帮助

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

} //中产阶级 公共类客户 { 私有静态字符串customerTN; 私有静态字符串customerName; 专用静态字符串自定义电话

公共静态字符串CustomerTN { 收到 { 退货客户; } 设置 { 如果value.Length==0 { 抛出新的例外项输入客户TN。。。; } 其他的 { customerTN=值; } } } 公共静态字符串客户名称 { 收到 { 返回客户名称; } 设置 { 如果value.Length==0 { 抛出新的例外项输入客户名称。。。; } 其他的 { 客户名称=价值; } } } 公共静态字符串自定义电话 { 收到 { 返回客户电话; } 设置 { 如果value.Length==0 { 扔掉新的例外者客户电话。。。; } 其他的 { 客户电话=价值; } } } }
您可以创建验证类的层次结构。每个验证类都有一个要验证的控件列表。进行验证时,如果控件不符合规则,则可以通过显示消息并将焦点放在该控件上来中止验证,例如:

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;
     }
}

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

请参阅和谷歌搜索C ErrorProvider。另外,请查看由CSLA作者创建的一个小应用程序:我很久以前就阅读了它,并从中学到了很多东西。@Codingyosi感谢您的帮助。在简单地检查了所提供的链接之后,我一定会更深入地调查您的建议。感谢您迅速而彻底的回答。“我会努力实现它。”弗林在StackOverflow上感谢人们的一个更好的方式是,如果他们的回答对你有帮助,就投票表决,或者如果他们的回答解决了你所面临的问题,就接受他们的回答。@CodingYoshi我知道Yoshi。但首先,我必须尝试并实施它,让它发挥作用。我还不知道它是否解决了我的问题。目前我正在阅读你们提供的链接,以便找到更简单的解决方案。尽管如此,我还是非常感谢DCG的时间和努力。所以,我投了赞成票。
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;
 }