将光标移动到C#文本框中

6
我想在点击按钮时将光标移到文本框中。我该怎么做?我尝试了Focus()方法,但它没有起作用。以下是代码。
CsNIPAddrTextBox.Focus();
CsNIPAddrTextBox.TabIndex = 1;

1
你的代码中这两行位于哪里? - Øyvind Bråthen
1
在你将焦点分配给文本框后,是否还有其他元素可能会占用焦点?实际上需要更多的代码。 - CSharpened
不,我没有关注其他任何事情。这是在一个树形视图控件的点击事件下。 - sanchop22
我喜欢使用WPF和MVVM模式来解决这类问题。希望有一天你也能转向使用WPF。 - Steve B
1
@CSharpened 这就是我添加评论的原因 ;) 也许他认为这是解决方案的一部分。 - Myrtle
显示剩余3条评论
8个回答

21
尝试使用textbox1.select()。这是将光标移到文本框的最佳方法。它还选择了文本框内的内容,使用户更容易编辑其中的内容。

8
如果这是一个“正常”的文本框(即非自定义),那么简单地调用Focus()应该就可以了。但是,如果它是只读的(我不确定——我没有尝试过。我知道你可以在只读框中得到插入符号,这意味着它可以获得焦点),那么可能不起作用。当然,如果它没有启用Enabled,那么你将无法设置焦点。
检查CanFocus属性是否为真——如果不是,那么可能有其他原因阻止控件接收焦点。
如果条件true,但是插入符仍未到达控件,则需要验证控件是否已经接收到。为文本框的GotFocus事件添加事件处理程序,并设置断点以澄清它是否被触发。我猜想你的断点会被触发。如果是这样的话,那么答案就是在你单击按钮后立即有另一个进程将焦点设置到另一个控件。例如,如果你在验证事件处理程序中执行此类操作,你将得到类似的结果,因为当处理程序被触发时,Windows Forms管道已经在更改控件。
另外,为什么要设置TabIndex=1?通常TabIndex在设计时设置并保持不变(除非当然这些是动态创建的)。除非你有一个特别的原因去这样做,否则我建议删除这一行。这与为什么会/不会起作用无关,只是一个观察结果。

CanFocus属性为true,我已经查过了。但是Focus()方法不起作用,当我点击时光标没有进入文本框。 - sanchop22
你尝试过移除控件并仔细检查是否添加了正确的控件吗?一个未被修改过的新文本框控件应该能够使用.Focus()获取焦点。如果仍然无法正常工作,那么建议测试GotFocus事件是下一步。 - CSharpened
@blabla 那么如果你发现这个答案行不通,为什么要接受它呢?试试Michay的答案,看看它是否可行,如果可行,那么应该接受它。 - barlop

5

再次编辑:

如果您尝试在TreeViewClick事件中选择一个TextBox,通常会失败,因为在Click事件之后,TreeNode将被选中,使得您之前的Focus()Select()无用。可行的方法是,在Timer中调用它们。

Timer t = new Timer();
t.Interval = 10;
t.Tick += new EventHandler((s,ev)=>textBox2.Focus());
t.Start();

这更类似于一种黑客方法...

不,我想把选项卡移到文本框上。这只是将鼠标指针移动到textbox1的位置。 - sanchop22
@petre 你看了我的最新回答了吗? - Alvin Wong

5

设置表单的ActiveControl属性

ActiveControl = yourtextbox

我曾经遇到了类似的问题,即焦点没有转移到选项卡页上的文本框。将该控件设置为窗体的活动控件解决了这个问题……而无需调用Focus()和SelectAll()函数。 - Syed Irfan Ahmad

2
你必须使用 TextBox.Select 方法
例如。
textbox1.Select(textbox1.Text.Length,0);

将光标设置到您的文本框中的文本末尾。

2

如果我理解正确,您是在谈论将鼠标光标移动到文本框中?- 那么您可以使用以下代码:

System.Windows.Forms.Cursor.Position = 
     PointToScreen( 
            new Point( textBox1.Location.X + 5, textBox1.Location.Y + 5) 
     );

2

我知道很多人已经提供了答案,但这可能对一些之前未能获得答案的人有用。对我来说有效的方法是,在输入文本上设置Select(),可以将光标设置到文本框中。

在表单构造函数中添加以下内容:

this.Activated += OnActivated;

处理程序代码:

private void OnActivated(object sender, EventArgs eventArgs)
        {
            txtUser.Select();
        }

1
如果textbox.Multiline=true和/或textbox.WordWrap = true,则光标可能会隐藏在字段底部。

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