我在_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;
为什么以及如何修复?提前谢谢。
答案 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
,现在工作正常。