【问题标题】:C# set text box cursor position works if a breakpoint is hit, not otherwise如果断点被击中,C# 设置文本框光标位置有效,否则无效
【发布时间】:2015-11-20 18:02:33
【问题描述】:

环境:Win7 Pro 上的 VS 2012。

我有一个从 TextBox 派生的控件。控件的文本被初始化为“00”。我想确保光标位于文本字符串的末尾(如果存在),只要控件变为活动状态。

我在一个用户控件中包含三个这样的控件。如果满足以下所有条件,我只能让光标定位按我想要的方式工作:

  1. 我在我的文本框派生控件中重写了 OnEnter()。
  2. 我在文本框派生控件中重写了 OnGotFocus()。
  3. 我正在调试器中运行我的测试表单。
  4. 我在 OnEnter() 的开头设置了一个断点。

这是我的覆盖:

    protected override void OnEnter(EventArgs e)
    {
        base.OnEnter(e);
        if (Text.Length > 0)
        {
            SelectionStart = Text.Length;
        }
    }

    protected override void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        if (Text.Length > 0)
        {
            SelectionStart = Text.Length;
        }
    }

非常感谢。

【问题讨论】:

  • 您有问题吗?

标签: c# winforms textbox


【解决方案1】:

当您使用 Tab 键切换到文本框时,您编写的代码确实有效(我只是对其进行了测试以确认)。 当您用鼠标单击文本框时,它不起作用。其原因可能是由于 dot net 将插入符号设置为鼠标光标位置,并且在GotFocus 事件被触发之后(并且GotFocus 事件在Enter 事件之后被触发)解雇,根据此链接:https://msdn.microsoft.com/en-us/library/system.windows.forms.control.gotfocus(v=vs.110).aspx)。

对此我没有一个优雅的解决方案,但在有人提出更好的解决方案之前,您可以添加一个小延迟(当您使用调试器中断时会发生这种情况),这对我来说似乎工作正常:

    protected override async void OnGotFocus(EventArgs e)
    {
        base.OnGotFocus(e);
        await Task.Delay(10);
        if (Text.Length > 0)
        {
            SelectionStart = Text.Length;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 2015-04-08
    相关资源
    最近更新 更多