在富文本框中显示行号c#

我有一个Multiline richtextbox控件,我想要集成添加行号的function。 我考虑过很多方法

  1. 添加标签并在行数更改时更新行号
  2. 添加一个图片框以在其上绘制字符串。
  3. 添加另一个文本框并在其上显示行号
  4. 添加列表框并在其中显示行号。

我有两个疑惑。

  1. 我正在使用的richtextbox是来自RichTextBox类的自定义控件和文件夹。 如何添加多个控件。
  2. 在c#中显示多行文本的行号的最佳方法是什么

我自己的例子。 一切都很好,但必须禁用wordwrap 🙁

int maxLC = 1; //maxLineCount - should be public private void rTB_KeyUp(object sender, KeyEventArgs e) { int linecount = rTB.GetLineFromCharIndex( rTB.TextLength ) + 1; if (linecount != maxLC) { tB_line.Clear(); for (int i = 1; i < linecount+1; i++) { tB_line.AppendText(Convert.ToString(i) + "\n"); } maxLC = linecount; } } 

其中rTB是我的richtextbox,而tB是rTB旁边的textBox

JT jr

这段代码帮助我感谢你,需要转换visual basic但是可以:

 Private Sub TextBox1_KeyUp(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles TextBox1.KeyUp Dim maxlc As Integer = 1 Dim linecount As Integer = TextBox1.GetLineFromCharIndex(TextBox1.Height) + 1 If linecount <> maxlc Then TextBox2.Clear() For i = 0 To linecount - 1 Step 1 TextBox2.AppendText(Convert.ToString(i) + vbNewLine) Next i maxlc = linecount End If End Sub 

工作100%! 但是你需要为行号添加richTextBox2,如果你想将它改成其他forms如listbox,无论如何它对我有用。

  private void richTextBox1_keyDown(object sender, KeyEventArgs e) { for (int i = 0; i <= richTextBox1.Lines.Count(); i++) { if (!(e.KeyCode == Keys.Back)) { if (!richTextBox2.Text.Contains(i.ToString())) { richTextBox2.Text += i.ToString() + "\n"; } } else { richTextBox2.Clear(); } } } 
  public int getWidth() { int w = 25; // get total lines of richTextBox1 int line = richTextBox1.Lines.Length; if (line <= 99) { w = 20 + (int)richTextBox1.Font.Size; } else if (line <= 999) { w = 30 + (int)richTextBox1.Font.Size; } else { w = 50 + (int)richTextBox1.Font.Size; } return w; } public void AddLineNumbers() { // create & set Point pt to (0,0) Point pt = new Point(0, 0); // get First Index & First Line from richTextBox1 int First_Index = richTextBox1.GetCharIndexFromPosition(pt); int First_Line = richTextBox1.GetLineFromCharIndex(First_Index); // set X & Y coordinates of Point pt to ClientRectangle Width & Height respectively pt.X = ClientRectangle.Width; pt.Y = ClientRectangle.Height; // get Last Index & Last Line from richTextBox1 int Last_Index = richTextBox1.GetCharIndexFromPosition(pt); int Last_Line = richTextBox1.GetLineFromCharIndex(Last_Index); // set Center alignment to LineNumberTextBox LineNumberTextBox.SelectionAlignment = HorizontalAlignment.Center; // set LineNumberTextBox text to null & width to getWidth() function value LineNumberTextBox.Text = ""; LineNumberTextBox.Width = getWidth(); // now add each line number to LineNumberTextBox upto last line for (int i = First_Line; i <= Last_Line + 2; i++) { LineNumberTextBox.Text += i + 1 + "\n"; } } private void Form1_Load(object sender, EventArgs e) { LineNumberTextBox.Font = richTextBox1.Font; richTextBox1.Select(); AddLineNumbers(); } private void richTextBox1_SelectionChanged(object sender, EventArgs e) { Point pt = richTextBox1.GetPositionFromCharIndex(richTextBox1.SelectionStart); if (pt.X == 1) { AddLineNumbers(); } } private void richTextBox1_VScroll(object sender, EventArgs e) { LineNumberTextBox.Text = ""; AddLineNumbers(); LineNumberTextBox.Invalidate(); } private void richTextBox1_TextChanged(object sender, EventArgs e) { if (richTextBox1.Text == "") { AddLineNumbers(); } } private void richTextBox1_FontChanged(object sender, EventArgs e) { LineNumberTextBox.Font = richTextBox1.Font; richTextBox1.Select(); AddLineNumbers(); } private void LineNumberTextBox_MouseDown(object sender, MouseEventArgs e) { richTextBox1.Select(); LineNumberTextBox.DeselectAll(); } private void Form1_Resize(object sender, EventArgs e) { AddLineNumbers(); }