C#のテキストボックスで行番号を取得する方法
テキストエディターなんかで、カーソル移動するとそれに伴って行番号が表示されています。これを作る方法を紹介します。
VS Codeだと以下の赤矢印のような表示です。
[ad#top-1]
やり方はいろいろありますが、今回の例では、カーソル位置以前のテキストを改行文字「\n」で配列化して、その要素数から現在位置(行)を特定する方法です。
private int getLine(){ if(textBox.ImeMode==ImeMode.Hiragana) return -1;</pre> int pos = textBox.Text.Substring(0, textBox.SelectionStart).Split('\n').Length; return pos; }
このメソッドをKeyUpイベントやMouseUpイベントで動かして返値を表示させると行数が取得できます。注意すべきはKeyDown, MouseDownイベントではダメだということです。Downイベント時にはまだカーソルが移動していないので前の1つ前のカーソル位置を読み取ってしまうので。
下図がその例。
上図のソースコードは下記の通りです。これをコピペして実行してください。
using System; using System.Drawing; using System.Windows.Forms; using System.Collections.Generic; class GetLine{ static void Main(string[] args){ Application.Run(new MainWindow(args)); } } class MainWindow : Form{ private RichTextBox textBox; private Label label; public MainWindow(string[] args){ this.StartPosition = FormStartPosition.CenterScreen; this.Width = 800; this.Height =600; this.Text = "テキストボックステスト"; textBox = new RichTextBox(){ Dock = DockStyle.Fill, Font = new Font("MS ゴシック", 18), AcceptsTab = true, WordWrap = false, Parent=this, }; textBox.KeyUp += new KeyEventHandler(keyUpped); textBox.MouseUp += new MouseEventHandler(MouseUpped); label = new Label(){ Size = new Size(40, 40), Font = new Font("MS ゴシック", 18), Dock = DockStyle.Top, Parent=this, }; } //keyUpイベントハンドラ private void keyUpped(object sender, KeyEventArgs e){ label.Text = this.getLine() + "行目"; } private void MouseUpped(object sender, MouseEventArgs e){ label.Text = this.getLine() + "行目"; } //行Noを取得 private int getLine(){ if(textBox.ImeMode==ImeMode.Hiragana) return -1; int pos = textBox.Text.Substring(0, textBox.SelectionStart).Split('\n').Length; return pos; } }
[ad#ad-1]
スポンサーリンク