2017-07-14 66 views
1

我有两个if-else条件,这将在Windows Forms文本框上显示一些文本。此文本框从除UI线程以外的其他线程设置文本。防止文本框覆盖以前的数据

语境:

delegate void SetTextCallback(string text); 

private void SetText(string text) 
{ 
    if (this.txtMessages.InvokeRequired) 
    { 
     SetTextCallback d = new SetTextCallback(SetText); 
     this.Invoke(d, new object[] { text }); 
    } 
    else 
    { 
     this.txtMessages.Text = text; 
    } 
} 

private void setTextFunc() 
{ 
    if(this condition is true) 
    { 
     setText("Hello from text 1" + Environment.NewLine); 
    } 
    else 
    { 
     setText("Hello from text 2" + Environment.NewLine); 
    } 
} 

现在的问题是,当Hello from text 2文字被显示出来,它覆盖的第一个文本。我希望它下面并保留第一个文本。 我该如何做到这一点?

我想过使用清单收集像这样:

List<string> listOfStrings = new List<string>(); 
listOfStrings.Add("Hello from text 1"); 
listOfStrings.Add("Hello from text 2"); 

然后通过这个名单收集迭代。会这样吗?

foreach(string x in listOfStrings) 
{ 
    MessageBox.Show(x); 
} 

有什么建议吗?我考虑了一个RichTextBox,但由于我不会在运行时编辑文本,所以我认为不需要它。

+0

可能你会使用'RichTextBox'?或者打开'TextBox'上的'Multiline'并使用'+ =' –

回答

6

你的问题是:

this.txtMessages.Text = text; 

在你setText方法替换您的文本字段的Text财产内容。如果要添加到现有的内容,你应该沿着线的东西替换代码:

this.txtMessages.Text = this.txtMessages.Text + text; 

当你的代码提示(由于增加的setTextFuncEnvironment.NewLine),你总是要划定与断行新增文字,考虑沿着线添加新的功能:

private void AppendText(string text) 
{ 
    // Code to trigger the Invoke here 
    else 
    { 
     this.txtMessages.Text = this.txtMessages.Text + Environment.newLine + text; 
    } 
} 

这样做也可以让你封装到一个单一的方法“以新行添加文本”的行为 - 在当你的setTextFunc方法有一个真的很小重复代码的数量(加入Environment.NewLine),你可以这样做。

+0

谢谢,它工作。 –

+0

@Harold_Finch,很高兴它有帮助=)我刚刚更新了答案,以更详细的smidge。 – Rob

+0

this.txtMessages.Text + = text; – Schuere