为何RichTextBox中modifiedtext.Length为20而非16?附代码示例
RichTextBox修改文本后长度不符合预期的原因分析
问题背景
在C# WinForms的RichTextBox中执行代码,给选中文本的每行开头添加制表符(\t):
- 原选中文本长度为11
- 拆分后
lines数组长度为5 - 预期修改后的文本长度应为
11+5=16,但实际输出为20
输入输出与控制台信息
输入RichTextBox内容
abc dfg 1
输出RichTextBox内容
abc dfg 1
控制台输出
selstart : 0 sellength : 11 selstart2: 5 sellength2: 20 tab space.Length: 1 lines.Length: 5
执行代码
private void button_click0001(object sender, EventArgs e) { int selstart = richTextBox1.SelectionStart; int sellength = richTextBox1.SelectionLength; Console.WriteLine("selstart : " + selstart ); //OUTPUT:0 Console.WriteLine("sellength : " + sellength ); //OUTPUT:11 string[] lines = richTextBox1.SelectedText.Split('\n'); for (int i = 0; i < lines.Length; i++) { lines[i] = "\t" + lines[i]; } string modifiedtext = string.Join(Environment.NewLine, lines); richTextBox1.SelectedText = modifiedText; int selstart2 = selstart + ("\t".Length * lines.Length); int sellength2 = modifiedText.Length; Console.WriteLine("selstart2: " + selstart2); //OUTPUT: 5 Console.WriteLine("sellength2: " + sellength2); //OUTPUT:20 Console.WriteLine("tab space.Length: " + "\t".Length); //OUTPUT:1 Console.WriteLine("lines.Length: " + lines.Length); //OUTPUT:5 richTextBox1.Select(selstart2 , sellength2); }
原因分析
核心问题出在换行符的处理差异:
- RichTextBox的
SelectedText中,换行是以单个字符\n存储的。原选中文本长度11,其中包含4个\n(因为Split('\n')得到5行,说明有4个换行分隔符),这4个\n总长度为4。 - 代码中用
string.Join(Environment.NewLine, lines)拼接行时,Windows系统下Environment.NewLine是\r\n(两个字符)。原本的4个\n被替换成4个\r\n,这就额外增加了4个字符(每个换行多1个\r)。 - 加上每行添加的5个
\t(每个占1字符,共+5),总长度变化为:原长度11 + 5(制表符) + 4(换行符新增的\r)=20,和实际输出一致。
修正建议
如果要让修改后的文本长度符合预期的16,只需将拼接时的换行符改为\n,保持和原文本一致:
string modifiedtext = string.Join("\n", lines);
内容的提问来源于stack exchange,提问作者allingfin
相关产品推荐
相关产品推荐

