.net “你怎么看?”;锁;窗体的焦点指向特定控件?

.net “你怎么看?”;锁;窗体的焦点指向特定控件?,.net,winforms,focus,.net,Winforms,Focus,如何将.net应用程序的焦点锁定到特定控件?例如,如果我有一个包含5个文本框的表单,并且我希望它们按特定顺序填写,那么我如何才能阻止位于框1中的人在框2上单击/切换,或者单击“确定”或“取消”或其他任何操作?是否有一种简单的方法,或者我必须在适当的时间手动禁用/启用彼此控制 显而易见的解决方案(焦点丢失时重置焦点)的问题在于,MSDN表示可以通过以下方式锁定机器: (来源:) 警告: 请勿尝试在Enter、GOTCHOCUS、LEVE、LostFocus、Validating或Validated

如何将.net应用程序的焦点锁定到特定控件?例如,如果我有一个包含5个文本框的表单,并且我希望它们按特定顺序填写,那么我如何才能阻止位于框1中的人在框2上单击/切换,或者单击“确定”或“取消”或其他任何操作?是否有一种简单的方法,或者我必须在适当的时间手动禁用/启用彼此控制

显而易见的解决方案(焦点丢失时重置焦点)的问题在于,MSDN表示可以通过以下方式锁定机器:

(来源:)

警告:


请勿尝试在Enter、GOTCHOCUS、LEVE、LostFocus、Validating或Validated事件处理程序中设置焦点。这样做可能会导致应用程序或操作系统停止响应。有关更多信息,请参阅“键盘输入参考”部分中的WM_KILLFOCUS主题,以及MSDN库中“关于消息和消息队列”主题的“消息死锁”部分,网址为

处理textBox1的离开事件。在事件处理程序内,如果您的条件未满足,例如,如果用户未输入某些输入,请将焦点重置回控件

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

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

  • 当文本框失去焦点时选中, 如果它没有有效的数据 进入,重新聚焦
  • 窗体尝试关闭时捕获 --检查文本框是否有正确的数据,如果没有 取消关闭
  • 捕获鼠标事件并检查 数据,将焦点发送到您需要的位置 无论用户是什么,都需要 努力

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

我认为TextBox.Validating event更合适,它专门用于此。此外,由于不必设置焦点,因此更容易,只需设置
e.Cancel=true
将焦点返回到当前控件

    void textBox1_Validating(object sender, CancelEventArgs e)
    {
        if (true) //Condition not met
        {
            e.Cancel = true;//Return focus to the current control
        }
    }
确保textbox属性下的CauseValidation为true,默认情况下,该值仍设置为true