我有一个RichTextBox。我正在提取内容并分配给相同的RichTextBox(这是针对realitime texteditor),RichTextBox在我给出换行符后不接受超过1个字符。我通过将值分配给另一个RichTextBox进行测试,如果工作正常。有人可以查看下面的代码吗?
private void richTextBox_TextChanged(object sender, EventArgs e)
{
string str = richTextEditor.Text;
string strMod = "";
richTextEditor.Clear();
if (str.Contains('\n'))
{
string[] strArr = str.Split('\n');
for (int i = 0; i < strArr.Count(); i++)
{
strMod += strArr[i];
strMod += Environment.NewLine;
}
}
else
{
strMod = str;
}
richTextEditor.AppendText(strMod);
}
答案 0 :(得分:1)
您正在向最后一行添加NewLine。修正:
for (int i = 0; i < strArr.Length; i++) {
strMod += strArr[i];
if (i < strArr.Length - 1) strMod += Environment.NewLine;
}
或者只是简单地说:
strMod = String.Join(Environment.NewLine, strArr);
还要注意此代码会导致TextChanged事件再次触发。你现在正在逃避它,因为你实际上并没有改变任何东西。但那运气很快就会消失。使用bool标志来防止重入引起麻烦:
private bool changingText = false;
private void richTextEditor_TextChanged(object sender, EventArgs e) {
if (changingText) return;
changingText = true;
try {
// etc...
}
finally {
changingText = false;
}
}
答案 1 :(得分:0)
在第一个新行之后,您将在此处添加一个额外的新行:
for (int i = 0; i < strArr.Count(); i++)
{
strMod += strArr[i];
strMod += Environment.NewLine;
}
所以,如果我输入:
Text M
我会得到
Text M
您在文本更改的最后一个条目之后添加了一个额外的行,这意味着任何新字符确实会触发拆分并添加新行。
查看我的评论。你为什么要这样做?你想要完成什么?
编辑:
有一种更简单的方法,使用Hans Passant的布尔标志:
private bool changingText = false;
private void richTextEditor_TextChanged(object sender, EventArgs e)
{
if (changingText) return;
changingText = true;
try
{
string str = richTextEditor.Text.Replace("\n", Environment.NewLine);
richTextEditor.Clear();
richTextEditor.AppendText(str);
}
finally
{
changingText = false;
}
}
然而,我之前的言论仍然存在:这实际上是一个不合适的操作,它会在每次改变时迫使插入符号结束。