【问题标题】:Bring cursor to a textbox in C#将光标移到 C# 中的文本框
【发布时间】:2022-01-05 04:33:55
【问题描述】:

我想在单击按钮时将光标带到文本框。我怎样才能做到这一点?我尝试了 Focus() 方法,但它不起作用。代码如下所示。

CsNIPAddrTextBox.Focus();
CsNIPAddrTextBox.TabIndex = 1;

【问题讨论】:

  • 这两行在你的代码中的什么位置?
  • 在将焦点分配给文本框后,是否还有其他元素可以成为焦点?确实需要更多代码。
  • 不,我不关注其他任何事情。它在树视图控件的点击事件下。
  • 我喜欢 WPF 和 MVVM 模式来解决此类问题。希望有一天你能够迁移到 WPF
  • @CSharpened 这就是我添加评论的原因;)也许他认为这是解决方案的一部分。

标签: c# winforms mouse-cursor


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果这是一个“正确的”文本框(即不是自定义的),那么只需调用 Focus() 就可以了。但是,如果它是只读的,它可能不会(我不确定 - 我没有尝试过。我知道您可以在只读框中获得插入符号,这意味着它可以获得焦点)。当然,如果不是Enabled,那么您将无法设置焦点。

    检查CanFocus 属性是否为真 - 如果不是,则可能有其他原因阻止控件接收焦点。

    但是,如果那是true,并且插入符号仍然无法到达控件 - 您需要验证它是否正在接收它。为文本框的GotFocus 事件添加一个事件处理程序,并为其设置断点以阐明它是否被命中。我的猜测是你的断点会被击中。如果是这样 - 那么答案是在您单击按钮后,另一个进程立即将焦点设置到另一个控件。 例如,如果您在验证事件处理程序中执行此类操作,您将获得类似的结果,因为 Windows 窗体管道在触发处理程序时已经在更改控件。

    还有 - 你为什么要设置TabIndex=1?通常TabIndex 在设计时设置并保持不变(当然,除非这些是动态创建的)。除非你有一个特殊的理由这样做我会摆脱那条线。这与为什么会/不会起作用无关 - 只是一个观察。

    【讨论】:

    • CanFocus 属性为真,我检查过了。 Focus() 不起作用,当我点击时光标没有转到文本框。
    • 您是否尝试过删除控件并仔细检查您是否添加了正确的控件。一个没有被弄乱的新文本框控件应该能够使用 .Focus() 获得焦点。如果它仍然不起作用,那么上面关于测试 GotFocus 事件的建议是你的下一步。
    • @blabla 那么如果您发现它不起作用,您为什么要接受这个答案呢?试试 Michay 的答案,看看它是否有效,如果有效,那么您应该接受它
    【解决方案3】:

    再次编辑:

    如果你尝试在TreeViewClick 事件中选择TextBox,通常会失败,因为在Click 事件之后,TreeNode 将被选中,从而使你之前的Focus()Select() 没用。可行的方法或许是通过Timer 调用它们。

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

    不过,这更像是一个 hack……

    【讨论】:

    • 不,我想将标签移动到文本框。这只会将鼠标指针移动到 textbox1 位置。
    • @petre 你检查过我的最新答案了吗?
    【解决方案4】:

    设置窗体的ActiveControl属性

    ActiveControl = yourtextbox
    

    【讨论】:

    • 我有一个类似的问题,焦点没有转移到标签页上的文本框。将该控件设置为表单的活动控件有效...无需调用 Focus() 和 SelectAll()
    【解决方案5】:

    你必须使用TextBox.Select Method

    例如

    textbox1.Select(textbox1.Text.Length,0);
    

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

    【讨论】:

      【解决方案6】:

      如果我没看错,您是说将鼠标光标移动到文本框? - 然后你可以使用这样的代码:

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

      【讨论】:

        【解决方案7】:

        我知道你们中的许多人已经提供了答案,但这可能对一些无法从之前的回复中得到答案的人有用。 这对我有用,在输入文本上设置 Select() 已将光标设置为文本框。

        在表单构造函数中有这个:

        this.Activated += OnActivated;
        

        处理程序代码:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-10-31
            • 2022-01-21
            • 1970-01-01
            • 1970-01-01
            • 2018-07-11
            相关资源
            最近更新 更多