テキストエディタの多くは左側に行番号が表示されます。さてこのようなものを作るにはどうすればいいのでしょうか?

まずユーザーコントロールを作成します。

そして

これでリッチテキストに入力されている文字列が変更されたときとスクロールされたときに表示されている部分の行が何行目であるか計算されて表示されます。

DrawLineNumber()について

まず最初に座標(0,0)に一番近い位置にある文字は先頭から何番目に存在するか調べます。

つぎにその文字の行番号を調べます。これをやるのがGetLineFromCharIndexメソッドです。

ループのなかで最初に求めた行番号をひとつずつ増やしながら、その文字が先頭から何番目にあるかを調べています。GetFirstCharIndexFromLineメソッドが-1を返したときはそんな行は存在しないということなのでループから脱出、GetFirstCharIndexFromLineメソッドが返した値を引数にしてGetPositionFromCharIndexメソッドと呼び出し、Y座標がRichTextBoxの高さを超えていた場合は表示されない部分なので、この場合もループから脱出しています。

あとは得られた行番号を表示するだけです。

これを使えば現在選択されている部分が何行目の何文字目なのかも表示できます。

UserControlRichクラスを継承してUserControlRichExを作ります。

UserControlRichクラスのプロパティを変更して内部にあるrichTextBoxにアクセスできるようにしておきます。

カーソルの位置が変更されたらOnSelectionChangedが呼び出されるので、そこでカーソルの行と行頭からの文字数を計算します。そしてイベントを起こして計算結果を伝えます。

あとは以下のようにすれば、テキストボックスにカーソル位置を表示させることができます。