RichTextBox比普通TextBox强大,就在于它能够包含多样式的数据,可以分段、分行自由设置需要的字体样式和颜色。看似简单,今天写的过程中却走了很多弯路,平时不注意的细节问题都显示出来,搞了大半天,终于收场,于是写下来供各位朋友参考,免得再走弯路。
遇到的最大问题是,明明分行选择的字符串,设置颜色和字体后,再增加数据,最终全部都变成设置的样式了。一步一步跟下来,发现问题的根源:换行符和增加字符串的方法。
手动增加一个换行符Envirement.NewLine,在RichTextBox的TextLength属性中会统计这个换行符,占一个长度,但是在Lines属性中却没有统计,因为,自动将这个换行符放在了下一行,即增加“×××”+Envirement.NewLine后,行数会变成增加2,而第二行什么都没有。
还有RichTextBox的Select方法的第一个参数是选择文本的起始位置,这个起始位置是从0开始的,不要认为从1开始,否则很容易就会多选一个而把下一行选进去,这样就会造成全部都选中了。
至于增加文本的方式,极力推荐用Append方法,因为最开始我就是用+=连接的,发现选择完一行后,再增加文本后,SelectionStart始终为0,想想也是,全部都删掉再增加的文本,起始位置可不就是0么。因此,为了向后移下行的选择位置,用Append方法增加文本,这样SelectionStart自动增加,只不过要在之前用变量记录下上次选择文本的结束位置。
下面就是简单的示例:
1: private void button1_Click(object sender, EventArgs e)
2: {
3: int selectStart = 0;
4:
5: richTextBox1.AppendText("??????????"+Environment.NewLine);
6: selectStart = richTextBox1.TextLength;
7: richTextBox1.Select(selectStart, richTextBox1.TextLength - 1);
8: richTextBox1.SelectionColor = Color.Red;
9: selectStart = richTextBox1.TextLength;
10: richTextBox1.AppendText("??????????" + Environment.NewLine);
11: richTextBox1.Select(selectStart, richTextBox1.TextLength - 1);
12: richTextBox1.SelectionColor = Color.Blue; ;
13: selectStart = richTextBox1.TextLength;
14: richTextBox1.AppendText("??????????" + Environment.NewLine);
15: richTextBox1.Select(selectStart, richTextBox1.TextLength - 1);
16: richTextBox1.SelectionColor = Color.Green;
17: }