为什么新行需要两个退格键来擦除 C#

Why new line takes two backspaces to erase c#

这是先前陈述(并已解决)问题的扩展 ()

我有两个文本框,必须根据用户在其中一个文本框中键入的内容进行同步。
现在,在您开始思考我可以简单地将文本框等同起来之前,我要告诉您这不是我的最终目标。所以,复制文本是行不通的。
问题:
文本由换行符组成,由

//Next Line
if (e.KeyData == Keys.Enter)
   textBox2.Text += Environment.NewLine;

当用户按下退格键时,它会使用

擦除字符
//Remove a character
if (e.KeyCode == Keys.Back && textBox2.TextLength != 0)
   textBox2.Text = textBox2.Text.Remove(textBox2.TextLength - 1, 1);

很简单,对吧?这是转折点。
每次我在换行符中写一些东西,然后擦除它以返回上一行,在第一个文本框中,需要两个退格键来擦除换行符并返回到上一行,在第二个文本框中。

例如,假设文本是
你好
你好

删除 "Hi":
你好

(新行仍然存在,因为我还没有尝试删除它)

现在,如果我想从 "Hello" 中删除 'o',我通常必须按两个退格键,然后我会得到 "Hell"(这就是第一个文本框中发生的情况,我打字的地方)
但是,这样做,第二个框中的文本仍然是 "Hello"。我用了第三个退格键来删除 'o'.
此时,我的两个文本框不同步了,因为
第一个文本框中的内容:"Hel"
第二个文本框中的内容:"Hell"

所以,请告诉我为什么会这样?以及我可以做些什么来修复它。

换行可能是一个字符。也可能是两个。

在我们都使用打字机的时代,它被称为 "Carriage Return" 和 "Line feed"。两个字符,一个接一个,表示换行。

您应该使用调试器并在添加新行时检查您的字符串。根据您的描述,如果看到 0x0d 字符后跟 0x0a 字符,我不会感到惊讶。