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*/