c# - 如何在 .NET 中验证后将焦点设置到控件

标签 c# winforms validation focus controls

我有一个 WinForm 应用程序,在一个表单上有几个输入控件。在验证事件处理程序(ValidatingValidated)中,我需要根据经过验证的值确定下一步要激活的控件。

在 Microsoft 的 Validating 文档中事件,它指出:

Caution

Do not attempt to set focus from within the Enter, GotFocus, Leave, LostFocus, Validating, or Validated event handlers. Doing so can cause your application or the operating system to stop responding. For more information, see the WM_KILLFOCUS topic in the "Keyboard Input Reference" section, and the "Message Deadlocks" section of the "About Messages and Message Queues" topic in the MSDN library at http: // msdn.microsoft.com/library.

Form 类有一个 ActiveControl 属性,允许设置要激活的控件,并且没有提到任何限制。经过几个小时的网络搜索,我没有找到任何其他解决方案。

从我的 Validated 事件处理程序中设置 ActiveControl 属性(而不是 Focus)是否是一种安全的方式来积极激活我想要的控件?如果不行,有什么解决办法吗?

因为 .NET Compact Framework 没有 ActiveControl 属性,有人可以提出解决方案吗?

最佳答案

是的,在 Validating 事件中改变焦点是相当麻烦的。该事件在焦点更改的确切时间引发。就 Windows 而言,下一个控件已获得焦点,但逻辑窗体状态仍将焦点放在正在验证的控件上。当您将 e.Cancel 设置为 true 时,Winforms 必须撤消 Windows 焦点状态。如果您不这样做,它必须在事件发生后更新逻辑状态。当您自己改变焦点时,可能会出现各种各样的错误。

重要的是要等到焦点被整理出来。最好的办法是延迟你的代码,直到一切都完成运行并且表单再次空闲。您可以使用 Control.BeginInvoke() 方法干净地完成此操作。像这样:

    private delegate void ChangeFocusDelegate(Control ctl);

    private void textBox1_Validating(object sender, CancelEventArgs e) {
        int value;
        if (!int.TryParse(textBox1.Text, out value)) e.Cancel = true;
        else {
            if (value == 1) this.BeginInvoke(new ChangeFocusDelegate(changeFocus), textBox2);
            else this.BeginInvoke(new ChangeFocusDelegate(changeFocus), textBox3);
        }
    }
    private void changeFocus(Control ctl) {
        ctl.Focus();
    }

关于c# - 如何在 .NET 中验证后将焦点设置到控件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4464256/

相关文章:

c# - 如何在 CSharp 项目文件中检查混淆是否成功

c# - 我在哪里放置最后添加记录的突出显示代码?

winforms - Windows 窗体应用程序转换为 .Net Framework 4.0 到 2.0

php - POST 提交未验证时保存表单数据

C++ char数组大小验证

asp.net-mvc - 自定义 DefaultModelBinder 验证消息

c# - .NET MongoDB 连接的最佳实践?

c# - 寻找一种在缓存时减少锁定的方法

c# - 如何在 Windows Phone 8.1 上缩放和滚动选择。帮帮我

c# - 确定哪个控件最接近鼠标指针