文本框聚焦

7

我创建了一个带有标签、文本框和按钮的表单。在表单加载事件中,我调用了文本框的focus()函数。但是当我运行代码时,光标并没有跳转到文本框。我需要光标在表单加载后立即进入文本框。该如何实现?

4个回答

8

如果您只需要确保在首次加载表单时某个控件获得焦点,则可以更改所有控件的TabOrder属性(在设计器中),使得相关控件为“0”,其他元素从“1”开始递增,“2”等等。

如果您需要根据某些条件在显示表单时动态选择不同的控件,则使用以下代码:

private void Form1_Load(object sender, EventArgs e) {
    // You need to show the form otherwise setting focus does nothing 
    // (there are no controls to set focus to yet!)
    this.Show()
    if (someCondition == true)
        control.Focus();
    else
        control2.Focus();
}

1
+1:设置正确的控件选项卡顺序,让框架来完成这个工作。 - Fredrik Mörk
4
他们可能希望有一个特定的标签顺序,但不一定想从0标签顺序属性开始。 - user110714
@monoxide:不必要的,大多数人会期望第一个聚焦元素位于左上角控件,因为(至少在西方)阅读是从上到下,从左到右。 - user110714
这与我的回答无关:我只是在说明如何更改第一个聚焦元素。 - Matthew Scharley
2
显然有不止一种方法可以做到这一点。现在我猜决定如何编写代码取决于Vicky了。 - user110714
显示剩余3条评论

3

可以处理“Shown”事件。这段代码应该可以正常工作。

private void Form1_Shown(object sender, EventArgs e)
{
    textBox2.Focus();
}

这与 "Activated" 解决方案一样存在问题,即如果您隐藏/显示相同的表单,它将始终重置焦点。这可能是好事,也可能不是。 - Matthew Scharley

1
不要在Load事件中调用Focus。在Activate事件中调用它。那样会起作用。

这也会导致每次激活表单时文本框都会获得焦点,这可能是不希望的。 - Fredrik Mörk
那么哪种方式更好?激活事件还是设置 TabOrder? - Vicky

1

如果您希望在窗体加载时焦点始终在文本框上,可以将文本框的TabIndex属性设置为0。(此属性最终总是在form.designer.cs中设置。因此,在form.cs中您无需编写任何额外的代码。)


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