TextBox のマウス位置に該当する行・桁位置を求める
短くて済むので、C# Tips というより、覚え書きとして、書き残しておきます。
C#2005 以降を前提としますが、任意のマウス位置から、テキストの文字インデックスを得るものとして、GetCharIndexFromPosition プロパティがあります。また、この文字インデックスにあたる行番号を取得出来る GetLineFromCharIndex プロパティと、指定行番号の先頭文字インデックスを得る GetFirstCharIndexFromLine プロパティを使用すれば、簡単な計算で桁位置も求められます。
具体的な使用例は、以下のとおりです。
private void textBox1_MouseDown(object sender, MouseEventArgs e)
{
int index = textBox1.GetCharIndexFromPosition(e.Location);
int line = textBox1.GetLineFromCharIndex(index);
int column = index - textBox1.GetFirstCharIndexFromLine(line);
Console.WriteLine("{0}行 {1}桁", line, column);
}
ここでは、MouseDown イベントを使用したので、この様な記述となります。しかし、例えば DrapDrop イベントで使用する場合は、マウスの座標がスクリーン座標となっている為、クライアント座標に変換する必要がある事に注意します。
private void textBox1_DragDrop(object sender, DragEventArgs e)
{
int index = textBox1.GetCharIndexFromPosition(
textBox1.PointToClient(new Point(e.X, e.Y)));
int line = textBox1.GetLineFromCharIndex(index);
int column = index - textBox1.GetFirstCharIndexFromLine(line);
Console.WriteLine("{0}行 {1}桁", line, column);
}