如何将文本追加到文本框的行?

时间:2012-01-23 16:35:49

标签: c# .net winforms events textbox

我在_TextChanged中使用以下代码:

string[] currentLines = new string[text.Lines.Length];
for (int i = 0; i < currentLines.Length; i++) {
       currentLines[i] = text.Lines[i] + "...";
}

text.Lines = currentLines;

在调用事件时崩溃。我不知道如何解决这个问题,当我这样做时发生了崩溃:

text.Lines = currentLines;

为什么以及如何修复?提前谢谢。

4 个答案:

答案 0 :(得分:4)

设置行可能会再次触发_TextChanged事件。你得到的错误是什么?如果你看到StackOverflowException,那就是原因。

你可以添加它来解决这个问题,或者采取Daniel在答案中提到的bool标志方法。

text.TextChanged -= textBox1_TextChanged;

text.Lines = currentLines;

text.TextChanged += textBox1_TextChanged;

此外,您可能对question discussing the difference between programmatic changes and user driven changes感兴趣。

答案 1 :(得分:1)

正如Adam S在他的回答中所指出的那样,由于无休止的递归,你最有可能获得StackOverflowException。您可以尝试修复它:

private void _TextChanged(...)
{
    static bool settingLines = false;
    if(settingLines)
        return;

    string[] currentLines = new string[text.Lines.Length];
    for (int i = 0; i < currentLines.Length; i++) {
           currentLines[i] = text.Lines[i] + "...";
    }

    settingLines = true;

    text.Lines = currentLines;

    settingLines = false;
}

此解决方案不是线程安全的,但在您的情况下这不是问题,因为您无论如何都要与UI控件进行交互。

答案 2 :(得分:0)

也许在有问题的行之前尝试取消订阅_TextChanged事件,并在之后重新订阅。

答案 3 :(得分:0)

解决方案:

由于我不知道的原因(如果您知道,请为我解释),此崩溃只发生在TextBox,我更换为RichTextBox,现在工作正常。