【问题标题】:How to set TextBox cursor position without SelectionStart如何在没有 SelectionStart 的情况下设置 TextBox 光标位置
【发布时间】:2013-02-28 14:36:45
【问题描述】:

我有一个带有后台线程的 Windows 窗体文本框,它每秒都会更新它的值。 如果我将光标放在文本框中,它将在下次更新时失去其当前位置。文本选择也是如此。

我试图这样解决它

    protected void SetTextProgrammatically(string value)
    {
        // save current cursor position and selection
        int start = textBox.SelectionStart;
        int length = textBox.SelectionLength;

        // update text
        textBox.Text = value;

        // restore cursor position and selection
        textBox.SelectionStart = start;
        textBox.SelectionLength = length;
    }

它大部分时间都很好用。这是它不起作用的情况:
1) 我将光标放在文本框中文本的末尾
2) 按 SHIFT 并使用 向左移动光标 选择将无法正常工作。

看起来 SelectionStart=10SelectionLength=1 的组合会自动将光标移动到位置 11(不是我想要的 10)。

如果有什么我可以做的,请告诉我!我正在使用 Framework.NET 2.0。
除了SelectionStart+SelectionLength之外,必须有一种方法可以在文本框中设置光标位置。

【问题讨论】:

  • 它将在下次更新时失去当前位置是什么意思?你想达到什么目的?
  • 表示光标会跳转到文本的开头
  • 我希望这个文本框能像任何其他文本框一样工作。它现在的工作方式有时令人恼火。我的意思是我只能在这个文本框中选择文本,只能从左到右移动。我就是不能从右到左移动
  • 我认为你看到的行为是正常行为。光标始终在选择的末尾,使用箭头键会导致选择长度为 0。
  • 你是绝对正确的。我同意你的看法。但是在普通文本框中,您可以选择从右到左移动的文本,对吗?我的文本框的唯一区别是它的文本在我尝试使用它时在背景中发生变化。

标签: c# winforms .net-2.0


【解决方案1】:
//save position
            bool focused = textBox1.Focused;
            int start = textBox1.SelectionStart;
            int len = textBox1.SelectionLength;
            //do your work
            textBox1.Text = "duviubobioub";
            //restore
            textBox1.SelectionStart = start;
            textBox1.SelectionLength = len ;
            textBox1.Select();

【讨论】:

  • 我看不出你的建议和我已经在使用的代码之间的区别。
  • 对不起.. 我忘记了 Select()
  • 不幸的是,这不是解决方案 - 没有任何改变。我仍然无法选择文本框内的文本,将光标从右向左移动。
  • 我发布了我用来测试该功能的整个代码,它对我有用,包括从右到左的选择
  • 奇怪的是,建议的代码不应该工作(就像我的一样)。它仍然对我不起作用。函数 Select(start, length) 将光标放在选择的末尾(您实际上可以看到它)。仅当您从右向左移动时才会出现问题,因为在这种情况下,您的移动方向相反。
【解决方案2】:

我找到了解决办法!

        // save current cursor position and selection 
        int start = textBox.SelectionStart;
        int length = textBox.SelectionLength;

        Point point = new Point();
        User32.GetCaretPos(out point);

        // update text
        textBox.Text = value;

        // restore cursor position and selection
        textBox.Select(start, length);
        User32.SetCaretPos(point.X, point.Y);

现在它可以正常工作了。

【讨论】:

    【解决方案3】:

    在文本框中设置光标位置而不选择开始...!

    textbox1.Select(textbox1.text.length,0); /* ===> End of the textbox  */
      textbox1.Select(0,0);                    /* ===> Start of the textbox  */
    

    【讨论】:

    • 当我使用 Select(0,0);它从 1 开始,留下一个空格。我的面具是“000-000-0000”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 2011-11-21
    • 1970-01-01
    • 2014-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多