如何将窗体的焦点“锁定”到特定控件上?

3
如何将 .net 应用程序的焦点锁定到特定控件?例如,如果我有一个包含 5 个文本框的表单,并且我想按照特定顺序填写它们,我如何阻止正在文本框 1 中输入的人切换到文本框 2,或者按下 OK 或 Cancel 或任何其他按钮?是否有简单的方法,还是必须在适当的时间手动禁用/启用每个其他控件?显然解决方案(失去焦点时重置焦点)的问题在于 MSDN 表示这样可以锁定你的机器。 (来源:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx
注意:
不要尝试从 Enter、GotFocus、Leave、LostFocus、Validating 或 Validated 事件处理程序内设置焦点。这样做可能会导致应用程序或操作系统停止响应。有关详细信息,请参见“键盘输入参考”部分中的 WM_KILLFOCUS 主题以及 MSDN 库中的“关于消息和消息队列”的“消息死锁”部分。http://msdn.microsoft.com/library
3个回答

4

处理textBox1的Leave事件。在事件处理程序中,如果条件不满足,例如用户没有输入任何内容,则将焦点重置回控件。

private void textBox1_Leave(object sender, EventArgs e)
{
    if string.isNullOrEmpty(textBox1.Text)
    {
        textBox1.focus();
    }
}

对于每个控件都要这样做,或者更加通用地进行操作:

private void textBox_Leave(object sender, EventArgs e)
{
    TextBox textBox = sender as TextBox;
    if (string.isNullOrEmpty(textBox.Text)
    {
        textBox.focus();
    }
}

3

基本上,你必须在设计中严格要求。

  • 检查文本框失去焦点的时间,如果它没有有效的数据输入,就重新获得焦点。
  • 捕获表单试图关闭的事件--检查文本框是否具有正确的数据,如果没有,取消关闭。
  • 捕获鼠标事件并检查数据,将焦点发送到您想要的位置,而不管用户尝试什么。

虽然如此,这是一个糟糕的想法,会让用户感到疯狂。我的建议是想出另一种范例来处理接收到的数据,以稳健的形式接收数据,而不是在设计中使用邪恶的方式并强制执行某些行为。


2

我认为TextBox.Validating事件更加合适,它专门用于此目的。而且这样做更容易,因为您不需要设置焦点,只需设置e.Cancel = true;即可将焦点返回到当前控件。

    void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if (true) //Condition not met
        {
            e.Cancel = true;//Return focus to the current control
        }
    }

请确保文本框的CauseValidation属性为true,这是默认设置的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接