本次采用了三种方法获取行数:
1、通过使用 Graphics 类的 MeasureString 方法来测量文本的高度并将其除以单行的高度。
int lineCount1 = (int)(rtbResult.CreateGraphics().MeasureString(rtbResult.Text, rtbResult.Font).Height / rtbResult.Font.Height + 1);
2、使用 GetLineFromCharIndex 方法获取 RichTextBox 中最后一个字符的行号,获取总行数。
int lineCount2 = rtbResult.GetLineFromCharIndex(rtbResult.TextLength);
3、直接获取控件的行数的长度。
int lineCount3 = rtbResult.Lines.Length;
在RichTextBox中的文本没有自动换行时,三种方法求得的行数如下所示:
在RichTextBox中的文本有自动换行时,三种方法求得的行数如下所示:
总结后可得,第二种方法能准确的获取 RichTextBox 中文本的行数,无论是否启用自动换行;第一种方法在没有自动换行的情况下能准确的获取 RichTextBox 中文本的行数,带自动换行的情况下,获取的是忽略掉自动换行的情况下的文本行数;第三种和第一种方法相同,获取的行数比第一种多1(猜测应该是包括光标所在的那一行)。
控制RichTextBox行数一定的程序如下:
BeginInvoke(new Action(() =>
{
rtbResult.SelectionStart = rtbResult.Text.Length;
rtbResult.SelectionLength = message.Length;
rtbResult.SelectionColor = color;
rtbResult.AppendText(DateTime.Now.ToString("HH:mm:ss ") + message);
//rtbResult.AppendText(message);
rtbResult.AppendText("\r\n");
rtbResult.SelectionStart = rtbResult.TextLength;
rtbResult.ScrollToCaret();
//int lineCount = (int)(rtbResult.CreateGraphics().MeasureString(rtbResult.Text, rtbResult.Font).Height / rtbResult.Font.Height + 1);
//tbResultLineNum0.Text = Convert.ToString(lineCount);
int lineCount = rtbResult.GetLineFromCharIndex(rtbResult.TextLength);
tbResultLineNum0.Text = Convert.ToString(lineCount);
if (lineCount >= 10)
{
//rtbResult.Clear();
//获取指定行的第一行的第一个字符的索引
int start = rtbResult.GetFirstCharIndexFromLine(1 - 1);
//获取指定行的最后一行的第一个字符的索引
int end = rtbResult.GetFirstCharIndexFromLine(lineCount - 10);
rtbResult.Select(start, end - start);//选中指定行
int a = rtbResult.SelectedText.Length;
rtbResult.SelectedText = "";//设置选择行的内容为空
//tbResultLineNum.Text = Convert.ToString(rtbResult.GetLineFromCharIndex(rtbResult.TextLength)+1);
}
int lineCount1 = (int)(rtbResult.CreateGraphics().MeasureString(rtbResult.Text, rtbResult.Font).Height / rtbResult.Font.Height + 1);
tbResultLineNum.Text = Convert.ToString(lineCount1);
int lineCount2 = rtbResult.GetLineFromCharIndex(rtbResult.TextLength);
tbResultLineNum1.Text = Convert.ToString(lineCount2);
int lineCount3 = rtbResult.Lines.Length;
tbResultLineNum2.Text = Convert.ToString(lineCount3);
}));
}