Current row and column numbers in RichTextBox in a Winforms application

How to get current row and column numbers in RichTextBox in a Winforms application?

Note

People, I just want a simple solution, if it is available to someone, and he wants to share it with us, and not links to research! Just give me the code, please! Otherwise, I have to buy control ...

+7
c # winforms richtextbox
source share
3 answers

For row and column, check out the Richer RichTextBox project. This is an extended version of RichTextBox that supports row and column numbers. Code from the article:

this.rtb.CursorPositionChanged += new System.EventHandler(this.rtb_CursorPositionChanged); this.rtb.SelectionChanged += new System.EventHandler(this.rtb_SelectionChanged); . . . private void rtb_CursorPositionChanged(object sender, System.EventArgs e) { int line = rtb.CurrentLine; int col = rtb.CurrentColumn; int pos = rtb.CurrentPosition; statusBar.Text = "Line " + line + ", Col " + col + ", Position " + pos; } private void rtb_SelectionChanged(object sender, System.EventArgs e) { int start = rtb.SelectionStart; int end = rtb.SelectionEnd; int length = rtb.SelectionLength; statusBar.Text = "Start " + start + ", End " + end + ", Length " + length; } 

To achieve this behavior, we need to extend the RichTextBox class as follows:

 using System; using System.Drawing; using System.Windows.Forms; namespace Nik.UserControls { public class RicherTextBox2 : System.Windows.Forms.RichTextBox { public event EventHandler CursorPositionChanged; protected virtual void OnCursorPositionChanged( EventArgs e ) { if ( CursorPositionChanged != null ) CursorPositionChanged( this, e ); } protected override void OnSelectionChanged( EventArgs e ) { if ( SelectionLength == 0 ) OnCursorPositionChanged( e ); else base.OnSelectionChanged( e ); } public int CurrentColumn { get { return CursorPosition.Column( this, SelectionStart ); } } public int CurrentLine { get { return CursorPosition.Line( this, SelectionStart ); } } public int CurrentPosition { get { return this.SelectionStart; } } public int SelectionEnd { get { return SelectionStart + SelectionLength; } } } internal class CursorPosition { [System.Runtime.InteropServices.DllImport("user32")] public static extern int GetCaretPos(ref Point lpPoint); private static int GetCorrection(RichTextBox e, int index) { Point pt1 = Point.Empty; GetCaretPos(ref pt1); Point pt2 = e.GetPositionFromCharIndex(index); if ( pt1 != pt2 ) return 1; else return 0; } public static int Line( RichTextBox e, int index ) { int correction = GetCorrection( e, index ); return e.GetLineFromCharIndex( index ) - correction + 1; } public static int Column( RichTextBox e, int index1 ) { int correction = GetCorrection( e, index1 ); Point p = e.GetPositionFromCharIndex( index1 - correction ); if ( pX == 1 ) return 1; pX = 0; int index2 = e.GetCharIndexFromPosition( p ); int col = index1 - index2 + 1; return col; } } } 

Display line number in RichTextBox for part of line number.

+1
source share

Thought I'd post a slightly simpler way to do this.

 // Get the line. int index = richTextBox.SelectionStart; int line = richTextBox.GetLineFromCharIndex(index); // Get the column. int firstChar = richTextBox.GetFirstCharIndexFromLine(line); int column = index - firstChar; 

Get the currently selected index, get the current row, then get a column to subtract the selected index from the index of the first character of this row.

+15
source share

All Articles