为什么GetCharIndexFromPosition每次返回最后一个字符的位置

本文关键字:字符 位置 最后一个 返回 GetCharIndexFromPosition 为什么 | 更新日期: 2023-09-27 17:58:11

我需要在文本框中拖放一个按钮,该按钮将在鼠标位置插入特定文本。问题是,每次我按下按钮时,文本都会插入最后一个字符之后,但我需要它们位于当前鼠标位置。

这是代码:

void textBox1_DragDrop(object sender, DragEventArgs e)
{
    TextBox tb = (TextBox)sender;
    int positionToInsert = 0;
    positionToInsert = tb.GetCharIndexFromPosition(new Point(e.X, e.Y));
    tb.Text = tb.Text.Insert(positionToInsert, (string)e.Data.GetData(DataFormats.Text));
}

为什么GetCharIndexFromPosition每次返回最后一个字符的位置

基于Control.DragDrop Event文档。

DragEventArgs的X和Y属性在屏幕坐标中,而不是在客户端坐标中。下面的Visual C#代码行将属性转换为客户端点。

你需要做以下

positionToInsert = tb.GetCharIndexFromPosition(tb.PointToClient(new Point(e.X, e.Y)));

否则,它可能是一个超出控制范围的点,从而返回TextBoxBase.GetCharIndexFromPosition 文件中所述的最后位置

如果指定的位置不在控件的客户端矩形内,或超出控件中的最后一个字符,则返回值为最后一个字符串的索引。

DragEventArgs的X和Y属性在屏幕坐标中,而不是客户端坐标。下面的Visual C#代码行转换客户端点的属性。

如果指定的点的坐标在TextBox的边界之外,则该方法返回文本框内最后一个字符的索引。

要测试这一点,请尝试:

tb.GetCharIndexFromPosition(new Point(1000, 1000));

解决方案:

Point clientPoint = tb.PointToClient(new Point(e.X, e.Y));
positionToInsert = tb.GetCharIndexFromPosition(clientPoint);