如何将表单的焦点“锁定”到特定控件?

时间:2008-11-11 20:25:23

标签: .net winforms focus

如何将.net应用程序的焦点锁定到特定控件?例如,如果我有一个包含5个文本框的表单,并且我希望它们按特定顺序填写,我怎样才能阻止第1个框中的某个人从选项卡/单击到框2,或者点击“确定”或“取消”或其他任何内容?有一种简单的方法,还是我必须在适当的时候手动禁用/启用其他控件?

显而易见的解决方案(焦点丢失后重置焦点)的问题在于MSDN说你可以用这种方式锁定你的机器:

(来源:http://msdn.microsoft.com/en-us/library/system.windows.forms.control.leave.aspx

注意:

请勿尝试从Enter,GotFocus,Leave,LostFocus,Validating或Validated事件处理程序中设置焦点。这样做可能会导致您的应用程序或操作系统停止响应。有关详细信息,请参阅“键盘输入参考”部分中的WM_KILLFOCUS主题,以及http://msdn.microsoft.com/library中MSDN库中“关于消息和消息队列”主题的“消息死锁”部分。

3 个答案:

答案 0 :(得分:5)

处理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();
    }
}

答案 1 :(得分:3)

基本上,你的设计必须是严苛的。

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

尽管如此,这是一个不好的想法,将导致疯狂的用户。我的建议是为您的数据输入提出另一种范例,它可以处理以强健形式接收数据,而不是在您的设计中出现恶意并强制执行某些行为。

答案 2 :(得分: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,默认情况下设置为true。