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