如何从WinForms中的文本框中删除焦点?


110

我需要从几个TextBoxes中删除焦点。我尝试使用:

textBox1.Focused = false;

ReadOnly属性值为true

然后,我尝试将焦点设置在窗体上,以便将其从所有TextBoxes中删除,但这也行不通:

this.Focus();

false选择文本框后,函数返回。

那么,如何从TextBox中删除焦点?

Answers:


113

您需要其他一些可聚焦的控件来将焦点移至。

请注意,您可以将焦点设置为标签。您可能需要考虑将[Tab]键放在下一步的位置。

另请注意,您不能将其设置为“表单”。诸如Form和Panel之类的容器控件会将Focus传递给其第一个子控件。您可能希望该文本框远离它。


谢谢; 我只是尝试着重于标签,现在文本框变得不集中。似乎由于某种原因您不能专注于表单。
卡伦·罗杰斯

7
容器控件(窗体,面板)会将“焦点”传递给它们的第一个子控件。
Henk Holterman

很棒的建议。这解决了我的问题。我正在针对表单本身使用KeyPress并具有多个按钮等。问题是该应用程序正在从读卡器获取输入,因此,如果焦点从表单本身移开,那么一切都将变得一团糟。单击按钮后专注于标签可以解决我的问题。非常感谢!
joelc

62

专注于标签对我没有用,做类似的事情label1.Focus()吗?加载表单时,文本框仍然具有焦点,但是尝试Velociraptors的 回答对我有用,将表单的Active控件设置为标签,如下所示:

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

7
我希望我能给你一百万箭。我尝试了人们建议的其他所有方法,这是唯一可行的方法。由于某种原因,文本框始终从所有内容中
夺走

3
这也适用于面板等容器控件。我只是想完全消除焦点,它起作用了:this.ActiveControl = panelOnMyForm;
Tim Schmelter 2013年

52

您可以添加以下代码:

this.ActiveControl = null;  //this = form

7
我相信这是最好的答案。对于控件设计者来说,许多其他方法(例如“焦点”)(如果您阅读MSDN)也被列为低级方法。如果您希望“不选择”其他所有内容,这似乎是最简单的方法,因为这只是一小行。
罗斯托夫

1
这可能是Microsoft首先添加此属性的原因的一半。
Panzercrisis

这似乎是最优雅的解决方案,在我看来,它是完美的。
NetWave

我真的希望这个答案能起作用,因为它看起来像应该的那样,但是在我的情况下,它却不起作用,因为它确实触发了Leave事件,但没有触发Validating / Validated事件。
Rhys Jones

32

尝试禁用和启用文本框。


5
同时,它会自动选择选项卡列表中的下一个控件,因此效果很好。
尼克,2010年

3
我正在使用MVVM在Silverlight中进行开发,并使用针对TextBox的行为实现了这一点。由于我没有方便的另一个UIElement来将重点放在“禁用/启用”解决方案上,因此发挥了作用。谢谢!
艾伯特·奥尔德菲尔德,2010年

如何禁用它?
miguelmpn 2015年

1
@miguelmpn textBox1.Enabled = false;将禁用您的文本框。并将其设置为true将重新启用它。
Raktim Biswas

24

您还可以将forms activecontrol属性设置为nulllike

ActiveControl = null;

7
我希望人们一直向下滚动,不要只是使用标记为答案的变通方法
makoshichi

仍然是今天最好的答案,这是哥们,请支持我。
xoxel

8

Focus设置输入焦点,因此将其设置为表单将不起作用,因为表单不接受输入。尝试将表单的ActiveControl属性设置为其他控件。您还可以Select用来选择特定的控件或SelectNextControl按选项卡顺序选择下一个控件。


1
在这里尝试了其他所有东西并Select()为我工作。
德里克·W

8

试试这个:

首先设置选项卡顺序。

然后,在表单加载事件中,我们可以通过编程将Tab键按下发送给应用程序。因此,该应用程序将以制表符顺序将焦点放在第一控制上。

在形式加载甚至写这行。

SendKeys.Send("{TAB}");

这确实为我工作。


4

这篇文章使我做到这一点:

ActiveControl = null;

这使我可以在不捕获其他控件的情况下捕获顶层的所有键盘输入。


3

我找到了一个不错的选择!它最适合我,而无需将重点放在其他方面。

试试看:

private void richTextBox_KeyDown(object sender, KeyEventArgs e)
{    
    e.SuppressKeyPress = true;
}

3

我在我的自定义控件上完成了此操作,在onFocus()上完成了此操作

this.Parent.Focus();

因此,如果texbox聚焦-它将立即聚焦文本框的父对象(窗体或面板...),如果要在自定义控件上进行设置,这是个不错的选择。


2

看来我不必将重点放在其他任何元素上。在Windows Phone 7应用程序上,我一直在使用Focus方法来取消设置文本框的Focus。

给出以下命令会将焦点设置为空:

void SearchBox_KeyDown(object sender, System.Windows.Input.KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        Focus();
    }
}

http://msdn.microsoft.com/zh-CN/library/system.windows.forms.control.focus.aspx

它对我有用,但我不知道为什么它对您不起作用:/


2

一个简单的解决方案是杀死焦点,只需创建自己的类:

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 2015年

1
    //using System;
    //using System.Collections.Generic;
    //using System.Linq;

    private void Form1_Load(object sender, EventArgs e)
    {
        FocusOnOtherControl(Controls.Cast<Control>(), button1);
    }

    private void FocusOnOtherControl<T>(IEnumerable<T> controls, Control focusOnMe) where T : Control
    {
        foreach (var control in controls)
        {
            if (control.GetType().Equals(typeof(TextBox)))
            {
                control.TabStop = false;
                control.LostFocus += new EventHandler((object sender, EventArgs e) =>
                {                     
                    focusOnMe.Focus();
                });
            }
        }
    }

0

我解决的方法是放置所有winform控件。我将所有标签和非选择winform控件设置为选项卡顺序0,然后将我的第一个控件设置为选项卡顺序2,然后将每个可选控件的顺序增加1、3、4、5等。

这样,当我的Winforms启动时,第一个TextBox没有焦点!


0

你可以用两种方法做到这一点

  • 只需将所需文本框的“ TabStop”属性设置为false即可,即使您只有一个文本字段也不会聚焦
  • 拖两个文本框

    1. 将不需要的焦点显示为textbox1
    2. 使第二个不可见,并转到该文本字段的属性,然后选择

tabindex的值设置为textbox2的0

  1. 并将textbox1的tabindex设置为1,现在它将不再关注textbox1

0

如果您想要的只是视觉效果,即文本框在其所有内容上都没有蓝色选择,则只需不选择任何文本:

textBox_Log.SelectionStart = 0;
textBox_Log.SelectionLength = 0;
textBox_Log.Select();

之后,使用添加内容时.Text += "...",不会显示蓝色选择。


0

请尽量设置TabStopFalse用于没有集中的视图控件。

例如:

txtEmpID.TabStop = false;

-1

在持有TextBox的Form或UserControl的构造函数中编写

SetStyle(ControlStyles.Selectable, false);

在InitializeComponent()之后;资料来源:https : //stackoverflow.com/a/4811938/5750078

例:

public partial class Main : UserControl
{

    public Main()
    {
        InitializeComponent();
        SetStyle(ControlStyles.Selectable, false);
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.