我有两个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 :(得分: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
),你可以通过这样做来避免。