Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 防止文本框覆盖以前的数据_C#_Winforms - Fatal编程技术网

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的知识,所以这也是第二个原因。