C# 防止文本框覆盖以前的数据
我有两个C# 防止文本框覆盖以前的数据,c#,winforms,C#,Winforms,我有两个if-else条件,它们将在Windows窗体文本框中显示一些文本。此文本框的文本设置来自UI线程以外的其他线程 上下文: delegate void SetTextCallback(string text); private void SetText(string text) { if (this.txtMessages.InvokeRequired) { SetTextCallback d = new SetTextCallback(Se
if-else
条件,它们将在Windows窗体
文本框中显示一些文本。此文本框的文本设置来自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);
}
}
现在的问题是,当显示来自文本2的Hello
text时,它会覆盖第一个文本。我希望它在下面,并保留第一个文本。
我怎样才能做到这一点
我考虑使用列表集合,如下所示:
List<string> listOfStrings = new List<string>();
listOfStrings.Add("Hello from text 1");
listOfStrings.Add("Hello from text 2");
有什么建议吗?我考虑过一个
RichTextBox
,但鉴于我不会在运行时编辑文本,我认为没有必要使用它。您遇到的问题是:
this.txtMessages.Text = text;
在setText
中,方法替换文本字段的Text
属性的内容。如果要添加到现有内容,应使用以下内容替换代码:
this.txtMessages.Text = this.txtMessages.Text + text;
private void AppendText(string text)
{
// Code to trigger the Invoke here
else
{
this.txtMessages.Text = this.txtMessages.Text + Environment.newLine + text;
}
}
正如您的代码所建议的(由于添加了<代码>环境.NeXLoe<代码> >代码> SETTrimFunc ),您总是希望用行中断定义新添加的文本,考虑沿着
行添加一个新函数。this.txtMessages.Text = this.txtMessages.Text + text;
private void AppendText(string text)
{
// Code to trigger the Invoke here
else
{
this.txtMessages.Text = this.txtMessages.Text + Environment.newLine + text;
}
}
这样做还允许您将“使用新行添加文本”的行为封装到单个方法中-目前您的
setTextFunc
方法有少量重复代码(添加Environment.NewLine
),您可以通过这样做来避免这些代码。您遇到的问题是:
this.txtMessages.Text = text;
在setText
中,方法替换文本字段的Text
属性的内容。如果要添加到现有内容,应使用以下内容替换代码:
this.txtMessages.Text = this.txtMessages.Text + text;
private void AppendText(string text)
{
// Code to trigger the Invoke here
else
{
this.txtMessages.Text = this.txtMessages.Text + Environment.newLine + text;
}
}
正如您的代码所建议的(由于添加了<代码>环境.NeXLoe<代码> >代码> SETTrimFunc ),您总是希望用行中断定义新添加的文本,考虑沿着
行添加一个新函数。this.txtMessages.Text = this.txtMessages.Text + text;
private void AppendText(string text)
{
// Code to trigger the Invoke here
else
{
this.txtMessages.Text = this.txtMessages.Text + Environment.newLine + text;
}
}
这样做还允许您将“使用新行添加文本”的行为封装到一个方法中-目前您的
setTextFunc
方法有非常少量的重复代码(添加Environment.NewLine
),您可以通过这样做来删除这些代码。您可能会使用RichTextBox
?或者在TextBox
上打开Multiline
并使用+=
可能您将使用RichTextBox
?或者在TextBox
上打开Multiline
,然后使用+=
@Harold_Finch,很高兴它能帮上忙=)我刚刚更新了一点更详细的答案。this.txtMessages.Text+=Text@Schuere表示同意,但没有看到在OPs代码中使用+=
,我选择保持简单,并尽可能明显地改变代码行为=)@Rob,我正在考虑发布我的答案。但由于你的更完整,我只是发表了一条评论,以证明这也可以通过添加一个额外的字符来解决。我不知道OP的知识,所以这也是第二个原因。@Harold_Finch,很高兴它有帮助=)我刚刚更新了一点更详细的答案。this.txtMessages.Text+=Text@Schuere表示同意,但没有看到在OPs代码中使用+=
,我选择保持简单,并尽可能明显地改变代码行为=)@Rob,我正在考虑发布我的答案。但由于你的更完整,我只是发表了一条评论,以证明这也可以通过添加一个额外的字符来解决。我不知道OP的知识,所以这也是第二个原因。