防止文本框覆盖以前的数据

时间:2017-07-14 11:34:02

标签: c# winforms

我有两个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但看到我不会在运行时编辑文本,我认为没有必要。

1 个答案:

答案 0 :(得分:6)

你遇到的问题是:

this.txtMessages.Text = text;

在您的setText方法替换文本字段的Text属性的内容。如果要添加到现有内容,则应使用以下内容替换代码:

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

正如您的代码建议的那样(感谢Environment.NewLine中添加了setTextFunc),您总是希望使用换行符分隔新添加的文本,请考虑添加一个新的函数。 :

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

执行此操作还允许您将“使用新行添加文字”的行为封装到单个方法中 - 此时您的setTextFunc方法的非常小重复量代码(添加Environment.NewLine),你可以通过这样做来避免。