如果遇到断点,则C#set文本框光标位置有效,否则无效

时间:2015-11-20 18:02:33

标签: c# winforms textbox

环境:Win7 Pro上的VS 2012。

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

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

  1. 我在我的文本框派生控件中覆盖了OnEnter()。
  2. 我在我的文本框派生控件中覆盖了OnGotFocus()。
  3. 我在调试器中运行我的测试表单。
  4. 我在OnEnter()的开头设置了一个断点。
  5. 以下是我的覆盖:

        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;
            }
        }
    

    非常感谢。

1 个答案:

答案 0 :(得分:0)

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

我没有一个优雅的解决方案,但是直到有人提出更好的东西,你可以添加一个小延迟(当你打破调试器时会发生这种情况),这似乎对我来说很好:< / p>

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