如何在WinForms中取消TextBox的焦点?

133

我需要移除多个文本框的焦点。我尝试过使用:

textBox1.Focused = false;

它的ReadOnly属性值为true

接着我尝试将焦点设置在表单上,以便从所有的文本框中移除它,但这也无法生效:

this.Focus();

当选中文本框时,该函数返回false

那么,我该如何将焦点从文本框中移除?

20个回答

85

您可以添加以下代码:

this.ActiveControl = null;  //this = form

8
我认为这是最好的答案。如果你阅读MSDN,像“聚焦”这样的其他方法被列为控件设计者的低级别方法。如果你想要其它所有东西都处于“未选中”状态,这似乎是最简单的方法,因为它只需要一行小代码。 - Rostov
2
这可能是微软首次添加此属性的原因之一。 - Panzercrisis
这似乎是最优雅的解决方案,在我的情况下它完美地工作了。 - NetWave
我真的希望这个答案能够起作用,因为它看起来应该可以,但在我的情况下它没有起作用,因为虽然它触发了Leave事件,但并没有触发Validating/Validated事件。 - Rhys Jones
1
这绝对是最简单和最有效的解决方案。您可以将此行添加到表单的Activated事件中,以防止子文本框自动选择所有文本。 - Special Sauce

77

专注于标签对我没有用,做类似 label1.Focus() 的事情是吧? 当加载表单时,文本框仍然拥有焦点,然而尝试Velociraptors 的回答,对我有效,像这样设置表单的活动控件到标签:


private void Form1_Load(object sender, EventArgs e)  
{ 
    this.ActiveControl = label1;       
}

11
我希望我能给你无数的赞。我尝试了别人建议的所有方法,但只有这一个有效。出于某种原因,文本框总是夺走了一切焦点... - eladyanai
3
这也适用于容器控件,例如面板。我只想完全删除焦点,并且它起作用了:this.ActiveControl = panelOnMyForm; - Tim Schmelter

36

尝试禁用和启用文本框。


6
这个功能非常方便,因为它会自动选择下一个标签列表中的控件。 - Nick
3
我正在使用MVVM在Silverlight中开发,并使用一个针对TextBox的行为实现了它。由于我没有其他可用于设置焦点的UI元素,因此禁用/启用解决方案非常有效。谢谢! - Albert Oldfield
我该如何禁用它? - miguelmpn
2
@miguelmpn textBox1.Enabled = false; 会禁用你的文本框,将其设置为 true 将重新启用它。 - Raktim Biswas

35

您还可以将表单的 activecontrol 属性设置为 null,如下所示:

ActiveControl = null;

7
希望读者能够一直向下滚动,找到这段话,并不仅仅只使用标记为答案的解决方法。请注意,翻译尽量保持原意,通俗易懂,不添加解释或其他内容。 - makoshichi
至今仍是最佳答案,伙计,接受我的点赞吧。 - N.K

9

Focus可以设置输入焦点,所以将其设置到表单上是行不通的,因为表单不接受输入。尝试将表单的ActiveControl属性设置为其他控件。您也可以使用Select选择特定控件或使用SelectNextControl选择制表顺序中的下一个控件。


1
我已经尝试了其他所有方法,但只有 Select() 能够解决我的问题。 - Derek W

8
尝试这个:
首先设置选项卡顺序。
然后在表单加载事件中,我们可以通过编程方式发送一个Tab键按下事件给应用程序。这样,应用程序将把焦点放在选项卡顺序中的第一个控件上。
在表单加载事件中,写入以下行。
SendKeys.Send("{TAB}");

这对我有用。
注:保留了 HTML 标签。

4
一个简单的解决方案是取消聚焦,只需要创建自己的类:
public class ViewOnlyTextBox : System.Windows.Forms.TextBox {
    // constants for the message sending
    const int WM_SETFOCUS = 0x0007;
    const int WM_KILLFOCUS = 0x0008;

    protected override void WndProc(ref Message m) {
        if(m.Msg == WM_SETFOCUS) m.Msg = WM_KILLFOCUS;

        base.WndProc (ref m);
    }
}

正是我正在寻找的解决方案。谢谢! - LeftyCoder

4
这篇文章激励我做了这件事:
ActiveControl = null;

这使我能够在顶层捕获所有的键盘输入,而不会影响其他控件。

3
我找到了一个很好的替代方案!它对我来说最有效,而且不会将焦点放在其他地方。请尝试以下方法:
private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}

3
我在自定义控件上完成了这个操作,我在onFocus()方法中实现了它。
this.Parent.Focus();

如果文本框处于聚焦状态,它会立即将其父级(表单或面板)设为聚焦状态...... 这是一个很好的选项,如果你想在自定义控件中使用它。


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