editorControl是一个userControl,其包含两个控件:左侧是一个用来显示行号的RichTextBox(使用label等均可),右侧是一个继承自RichTextBox的componenteditorGrid1。 /*实现行号 begin*/ (1) 添加事件 private void richTextBoxMain_TextChanged(object sender, EventArgs e) { updateLabelRowIndex(); } private void richTextBoxMain_FontChanged(object sender, EventArgs e) { updateLabelRowIndex(); richTextBoxMain_VScroll(null, null); } private void richTextBoxMain_Resize(object sender, EventArgs e) { richTextBoxMain_VScroll(null, null); } private void richTextBoxMain_VScroll(object sender, EventArgs e) { //move location of numberLabel for amount of pixels caused by scrollbar int p = richTextBoxMain.GetPositionFromCharIndex(0).Y % (richTextBoxMain.Font.Height + 1); labelRowIndex.Location = new Point(0,p); updateLabelRowIndex(); } (2)更新行号的函数 private void updateLabelRowIndex() { //we get index of first visible char and number of first visible line Point pos = new Point(0,0); int firstIndex = this.richTextBoxMain.GetCharIndexFromPosition(pos); int firstLine = this.richTextBoxMain.GetLineFromCharIndex(firstIndex); //now we get index of last visible char and number of last visible line pos.X += this.richTextBoxMain.ClientRectangle.Width; pos.Y += this.richTextBoxMain.ClientRectangle.Height; int lastIndex = this.richTextBoxMain.GetCharIndexFromPosition(pos); int lastLine = this.richTextBoxMain.GetLineFromCharIndex(lastIndex); //this is point position of last visible char, //we'll use its Y value for calculating numberLabel size pos = this.richTextBoxMain.GetPositionFromCharIndex(lastIndex); labelRowIndex.Text = ""; for (int i = firstLine; i <= lastLine +1 ; i++) { labelRowIndex.Text += i + 1 + "\r\n"; } } /*end*/