editorControl是一个userControl,其包含两个控件:左侧是一个用来显示行号的RichTextBox(使用label等均可),右侧是一个继承自RichTextBox的component--editorGrid1。
(1) 添加事件
editorGrid1.TextChanged += new EventHandler(editorGrid1_TextChanged);
editorGrid1.VScroll += new EventHandler(editorGrid1_VScroll);
void editorGrid1_VScroll(object sender, EventArgs e)
{
int p = editorGrid1.GetPositionFromCharIndex(0).Y % (editorGrid1.Font.Height + 1);
richTextBox1.Location = new Point(0, p);
DrewLineNumber();
}
private void editorGrid1_TextChanged(object sender, EventArgs e)
{
if ( fchange )
{
Regex r = new Regex(@"/*");
if( ! r.IsMatch(Parent.Text))
{
Parent.Text += " *";
}
}
DrewLineNumber();
}
(2)更新行号的主函数
private void DrewLineNumber()
{
Point pos = new Point(0, 0);
int firstIndex = editorGrid1.GetCharIndexFromPosition(pos);
int firstLine = editorGrid1.GetLineFromCharIndex(firstIndex);
pos.X = editorGrid1.ClientRectangle.Width;
pos.Y = editorGrid1.ClientRectangle.Height;
int endIndex = editorGrid1.GetCharIndexFromPosition(pos);
int endLine = editorGrid1.GetLineFromCharIndex(endIndex);
richTextBox1.Text = "";
for (int i = firstLine; i <= endLine +1 ; i++)
{
richTextBox1.Text += i + 1 + "/n";
}
}