3

我使用下面的代码将焦点设置到文本字段:

public void setFieldInFocus(TabPage tabPage)
    {
        foreach (Control t in tabPage.Controls)
        {
            if (t is TextBox)
            {
                if (t.Name == fieldInFocus)
                {
                    t.Focus();              

                }
            }

        }

    }

光标显示在文本字段中,但是当我尝试使用移动键盘输入文本时,在我单击文本字段之前没有任何反应,即使光标已经在文本字段中。然后我单击文本字段并尝试使用移动键盘输入文本,它可以工作。为什么我仍然必须单击文本字段才能输入文本?我能做些什么来解决这个问题?

请注意,我使用的是紧凑框架 3.5 和 textField.Select(); 不可用。

谢谢

4

1 回答 1

1

您发布的代码片段何时执行?是在表单实际显示之前吗?如果是这样,.NET 运行时将覆盖您的手动焦点设置并将其更改为表单上的第一个可聚焦控件。

即使光标出现在文本框内,它也可能不是具有焦点的控件。

我认为不太理想的一种解决方案是在表单加载事件触发时以非常短的间隔(比如 10)在表单上放置一个计时器。在 timer_tick 处理程序中,禁用计时器(确保它只运行一次),然后执行您的代码片段。以这种方式执行代码可确保在执行焦点覆盖代码之前,Windows 消息泵有机会完全加载和显示您的表单(并在执行它的默认焦点例程的过程中)。

缓解此问题的更好方法是尝试以使文本框成为第一个可聚焦项目的方式设计表单。默认情况下,表单将以深度优先的方式迭代其子控件树,一旦找到可聚焦的控件,它就会聚焦该控件并退出。

如果您查看表单的设计器代码文件,请尝试手动调整它,以确保:

  1. 文本框是添加到标签页的第一个控件
  2. 标签页是添加到标签控件的第一个控件
  3. tabcontrol 是添加到表单的第一个控件。

当这三件事为真时,默认情况下文本框将首先聚焦,您无需运行任何其他代码来覆盖它。

希望这可以帮助。

于 2012-04-24T19:38:03.983 回答