为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);
} 

为RichTextBox分配相同值无效

您正在向最后一行添加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;
    }
}

然而,我之前的话仍然存在:这本质上是一个不恰当的操作,它迫使插入符号在每次更改时都结束。