如何在文本框中找到光标的位置?C#

64
我有一个标准的WinForms文本框,我想在光标位置插入文本。如何获取光标位置? 谢谢。

你需要在整个屏幕上定位,还是在表单上定位? - Avram
你可以读一下我下面的最新帖子吗?谢谢。 - James May
9个回答

94

不论文本是否被选中,SelectionStart 属性都代表插入符在文本中的索引位置。因此您可以使用 String.Insert 方法来添加一些文本,比如这样:

myTextBox.Text = myTextBox.Text.Insert(myTextBox.SelectionStart, "Hello world");

这很棒,但是如果您按下回车键,SelectionStart会增加2。有任何想法为什么会这样? - user12393625
2
可能是因为换行符(至少在Windows上)是字符10和字符13的组合 - 换行和回车。 - Matt Hamilton
哦!谢谢:D - user12393625

15
你想检查文本框中的SelectionStart属性。

8

詹姆斯,当你只想在光标位置插入一些文本时,替换整个字符串非常低效。

更好的解决方案是:

textBoxSt1.SelectedText = ComboBoxWildCard.SelectedItem.ToString();

当您没有选择任何内容时,新文本将插入光标位置。如果您选择了某些内容,则会用要插入的文本替换所选文本。
我从eggheadcafe网站找到了这个解决方案。

5
你只需要这样做:
双击要在文档光标处插入文本的项目(按钮,标签等),然后输入以下内容:
richTextBox.SelectedText = "whatevertextyouwantinserted";

两年前的这个答案的副本。 - Michael Mrozek

4

这是我的工作实现,允许仅输入数字,并恢复上次有效的输入文本位置:

Xaml:

<TextBox
      Name="myTextBox" 
      TextChanged="OnMyTextBoxTyping" />

后台代码:

private void OnMyTextBoxTyping(object sender, EventArgs e)
{
    if (!System.Text.RegularExpressions.Regex.IsMatch(myTextBox.Text, @"^[0-9]+$"))
    {
        var currentPosition = myTextBox.SelectionStart;
        myTextBox.Text = new string(myTextBox.Text.Where(c => (char.IsDigit(c))).ToArray());
        myTextBox.SelectionStart = currentPosition > 0 ? currentPosition - 1 : currentPosition;
    }
}

完美。再简洁不过了。 - Computer User

2

您需要将 SelectionStart 属性存储在一个变量中,然后当您按下按钮时,将焦点移回到文本框。然后将 SelectionStart 属性设置为变量中的属性。


2
要获取在TextBox文本内单击鼠标时插入符号的位置,请使用TextBoxMouseDown事件。使用MouseEventArgs的X和Y属性创建一个点。TextBox有一个名为GetCharIndexFromPosition(point)的方法,将该点传递给它并返回插入符号的位置。如果您使用鼠标确定要插入新文本的位置,则此方法可行。请注意保留HTML标签。

-1:原问题没有提到需要在鼠标事件响应中获取光标位置,而且该问题已经在2009年得到了回答和接受。 - William Price
1
哈哈...这有点有趣。实际上,问题是关于光标的位置,所以这是一个不错的答案。很明显,问题实际上想要的是插入符号的位置而不是光标,但这不是他们所问的。 - Jeff Roe

2

您建议我在什么事件中记录变量?是离开吗?

目前我有:

private void comboBoxWildCard_SelectedIndexChanged(object sender, EventArgs e)
{
    textBoxSt1.Focus();
    textBoxSt1.Text.Insert(intCursorPos, comboBoxWildCard.SelectedItem.ToString());

}

private void textBoxSt1_Leave(object sender, EventArgs e)
{
    intCursorPos = textBoxSt1.SelectionStart;
}

离开事件的录制工作,但文本未被插入,我有什么遗漏吗?

更新:我需要使用textBoxSt1.Text =

textBoxSt1.Text = textBoxSt1.Text.Insert(intCursorPos, comboBoxWildCard.SelectedItem.ToString());

感谢大家。
谢谢。

1
int cursorPosition = textBox1.SelectionStart;
//it will extract your current cursor position where ever it is
//textBox1 is name of your text box. you can use one
//which is being used by you in your form

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