【问题标题】:Is there any other way to append text to a Textbox control?有没有其他方法可以将文本附加到 Textbox 控件?
【发布时间】:2010-02-18 08:42:18
【问题描述】:

我有一个自定义日志框架写入 System.Windows.Forms.TextBox。我现在写到 TextBox 的方式是这样的:

tbLog.Text += newLogEntry.Text;

这种方法的问题在于,每次执行此方法时,tbLog.Text 和 newLogEntry.Text 中的字符串都会连接起来,然后分配给 tbLog.Text。随着 TextBox 中日志的增长,该操作变得非常占用内存并且速度越来越慢。

有什么方法可以更快更有效地做到这一点?

【问题讨论】:

  • 为什么要登录到文本框?应用程序关闭的那一刻,您将丢失日志。它必须保留完整的历史记录,还是只保留最新的 x 个条目?

标签: c# .net textbox winforms


【解决方案1】:

TextBox 有一个函数AppendText()。您应该改用它,因为它的性能比 += 运算符好得多。

【讨论】:

    【解决方案2】:

    “问题”是将一个字符串附加到另一个字符串,每次都会产生一个新字符串。 当您进行大量连接时,这可能会非常昂贵。

    如果我是你,我不会直接登录到 TextBox。我只会跟踪所有日志消息,并使用文本框来可视化日志。 通过这样做,您可以选择将日志也保存到文本文件中,或者选择以任何其他方式可视化日志。

    例如,您可以将消息保存在 StringCollectionList<String> 中。例如,您可以使用 ListBox,而不是在文本框中将其可视化,并且每次将新项目添加到日志时,都可以将新项目添加到 ListBox。 但是,我会确保这不是紧密耦合的。 例如,每次将新消息保存到日志时,您的日志类可能会触发一个事件。 然后,您可以拥有不同的“观察者”,通过订阅事件来跟踪日志,并在每次引发事件时采取适当的行动。

    【讨论】:

      【解决方案3】:

      就个人而言,我会先使用 .Append() 在 StringBuilder 中完成所有工作。然后,我将使用 StringBuilder 上的 .ToString() 方法设置文本框文本属性。

      【讨论】:

      • 不,你没有使用字符串生成器。
      • 好的。我误解了你的回答。我认为你的意思是我应该这样做: var sb = new StringBuilder(tbLog.Text); sb.AppendLine(newLogEntry.Text); tbLog.Text= sb.ToString() 但是现在我在记录器类中使用字符串生成器作为类变量,并且每次都有新条目文件时附加到它。
      猜你喜欢
      • 2021-08-03
      • 2020-02-22
      • 2018-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多