为RichTextBox分配相同值无效
本文关键字:无效 RichTextBox 分配 | 更新日期: 2023-09-27 18:19:36
我有一个RichTextBox。我正在提取内容并分配给同一个RichTextBox(这是用于实时文本编辑器),在我给出换行符后,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);
}
您正在向最后一行添加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;
}
}
在第一个新行之后,您将在此处添加一个额外的新行:
for (int i = 0; i < strArr.Count(); i++)
{
strMod += strArr[i];
strMod += Environment.NewLine;
}
所以如果我输入:
文本M
我会得到
文本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;
}
}
然而,我之前的话仍然存在:这本质上是一个不恰当的操作,它迫使插入符号在每次更改时都结束。