C# 验证错误后将焦点设置在控件上

C# 验证错误后将焦点设置在控件上,c#,winforms,validation,C#,Winforms,Validation,在我的winforms项目中,对于一个特定的表单,我有将近10个控件,用于firstname、lastname、age、occulation等(包括文本框、下拉列表)和一个SAVE按钮 我为这些控件创建了表示数据源的类,并在同一个类中实现了验证方法,该类对每个属性进行验证并抛出验证消息 问题是,当我想在UI中抛出验证错误的控件上设置焦点时,会出现问题 如何实现这一点。将控件传递回类是不好的做法 我是否需要更改在类级别实现验证的方式 有任何建议/链接吗?我建议您使用.NET提供的实际验证技术:

在我的winforms项目中,对于一个特定的表单,我有将近10个控件,用于firstname、lastname、age、occulation等(包括文本框、下拉列表)和一个SAVE按钮

我为这些控件创建了表示数据源的类,并在同一个类中实现了验证方法,该类对每个属性进行验证并抛出验证消息

问题是,当我想在UI中抛出验证错误的控件上设置焦点时,会出现问题

如何实现这一点。将控件传递回类是不好的做法

我是否需要更改在类级别实现验证的方式


有任何建议/链接吗?

我建议您使用.NET提供的实际验证技术:

我还强烈建议添加一个,并使用它来指示错误是什么。没有给出这方面的例子,但谷歌有很多很好的例子

您可以保留验证类,只需将每个控件订阅到类上的方法

例如(请原谅K&R,在s.O.上写比较容易,而且这可能需要一些调整,我是从内存中写的):


注意:传递控件并不坏。控件是一个对象,就像其他对象一样。您不是“表单”编程。你只是在编程,而你的对象恰好有屏幕上的表现。不好的做法是让对象与不属于它们的东西混在一起。我尝试实现了您提到的代码。问题是,例如,假设我想验证控件LastName textbox,则上述代码仅在焦点转到LastName textbox(GotFocus)时才起作用在focuslost上,它会验证它是否为null/empty..我正在寻找一个如果focus未转到该控件,并且用户单击save按钮。。它应该显示验证消息并将焦点设置在该控件上
public MyForm : Form {

    Validator validator;

    public MyForm() {
        validator = new Validator(/*Arguments here*/);
    }

    public override void OnLoad(EventArgs e) {
        base.OnLoad(e);

        targetControl.Validating += (o,e) => {
            try {
                validator.Validate(e);
            }
            catch(YourException exc) {
                e.Cancel = true; //References the validating event args
                //Whatever else you want to do
            }
        }
    }
}