【问题标题】:Set focus on controls after validation error验证错误后将焦点设置在控件上
【发布时间】:2012-07-12 07:56:07
【问题描述】:

在我的 winforms 项目中,对于一个特定的表单,我有近 10 个用于名字、姓氏、年龄、职业等的控件(包括文本框、下拉列表)和一个保存按钮

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

当我想将焦点设置在在 UI 中引发验证错误的控件上时,就会出现问题。

我如何实现这一点。将控件传回课堂是不好的做法。

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

有什么建议/链接吗?

【问题讨论】:

  • 注意:通过控件也不错。控件是一个对象,就像所有其他对象一样。你不是“表单”编程。您只是在编程,而您的对象恰好具有屏幕表示。 不好的做法是让对象乱搞不属于他们的东西来乱搞

标签: c# winforms validation


【解决方案1】:

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

ValidatingValidated

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

您可以保留您的验证类并简单地为每个控件订阅该类的方法。

例如(原谅 K&R,在 S.O. 上写更容易,这可能需要一些调整,我是凭记忆写的):

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

【讨论】:

  • 我尝试实现你提到的代码..问题是例如我想验证控制姓氏文本框,上面的代码只有在焦点转到姓氏文本框时才有效(GotFocus)并在 focuslost 上验证它是否为空/空..我正在寻找一个如果焦点没有转到该控件并且用户单击保存按钮..它应该显示验证消息并将焦点设置在该控件上
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
  • 2011-10-12
  • 1970-01-01
  • 2012-04-09
  • 2014-01-22
  • 2011-07-02
  • 2011-03-21
相关资源
最近更新 更多