【问题标题】:How to add a line to a multiline TextBox?如何在多行文本框中添加一行?
【发布时间】:2011-12-16 16:15:56
【问题描述】:

如何向multi-line TextBox 添加一行文本?

例如伪代码;

textBox1.Clear();
textBox1.Lines.Add("1000+");
textBox1.Lines.Add("750-999");
textBox1.Lines.Add("400-749");
...snip...
textBox1.Lines.Add("40-59");

textBox1.Lines.Append("brown");
textBox1.Lines.Append("brwn");
textBox1.Lines.Append("brn");
textBox1.Lines.Append("brow");
textBox1.Lines.Append("br");
textBox1.Lines.Append("brw");
textBox1.Lines.Append("brwm");
textBox1.Lines.Append("bron");
textBox1.Lines.Append("bwn");
textBox1.Lines.Append("brnw");
textBox1.Lines.Append("bren");
textBox1.Lines.Append("broe");
textBox1.Lines.Append("bewn");

TextBox.Lines 实现的唯一方法(我可以看到)是:

  • 克隆
  • 复制到
  • 等于
  • 获取类型
  • GetHashCode
  • 获取枚举器
  • 初始化
  • GetLowerBound
  • GetUpperBound
  • 获取长度
  • GetLongLength
  • 获取值
  • 设置值
  • ToString

【问题讨论】:

  • 你不能使用 append(Enviroment.NewLine) 吗??
  • TextBox.Lines 是文本的只读表示。请参考msdn.microsoft.com/en-us/library/…
  • @Casperah Ohhh,这有助于解释为什么它不能用来做我想做的事——微软(以一种不那么微妙的方式)阻止你做一个较慢的代码路径
  • Casperah - 您发送的文档链接明确指出:“获取或设置文本框控件中的文本行。”获取或设置。问题不在于它不可改变,而在于如何改变它。 Lines 是指向数组的指针(引用),因此您必须构建一个字符串数组,然后将 Lines 指向它。字符串 [] newLines = 字符串 [5]; textbox.Lines = newLines;

标签: c# winforms textbox


【解决方案1】:

@Casperah 指出我想错了:

  • TextBox 没有
  • 它有文字
  • 如果需要,可以在 CRLF 上将文本拆分成行
  • 但没有的概念

那么问题是如何完成我想要的,而不是 WinForms 让我做什么。

在其他给定的变体中存在细微的错误:

  • textBox1.AppendText("Hello" + Environment.NewLine);
  • textBox1.AppendText("Hello" + "\r\n");
  • textBox1.Text += "Hello\r\n"
  • textbox1.Text += System.Environment.NewLine + "brown";

当(可能)不需要时,它们会附加或添加换行符。

所以,扩展助手:

public static class WinFormsExtensions
{
   public static void AppendLine(this TextBox source, string value)
   {
      if (source.Text.Length==0)
         source.Text = value;
      else
         source.AppendText("\r\n"+value);
   }
}

那么现在:

textBox1.Clear();
textBox1.AppendLine("red");
textBox1.AppendLine("green");
textBox1.AppendLine("blue");

textBox1.AppendLine(String.Format("Processing file {0}", filename));

注意:任何代码都会发布到公共领域。无需署名。

【讨论】:

    【解决方案2】:

    我会选择System.Environment.NewLineStringBuilder

    然后您可以使用这样的字符串生成器添加行:

    StringBuilder sb = new StringBuilder();
    sb.AppendLine("brown");
    sb.AppendLine("brwn");
    
    textbox1.Text += sb.ToString();
    

    或像这样的新行:

    textbox1.Text += System.Environment.NewLine + "brown";
    

    更好:

    StringBuilder sb = new StringBuilder(textbox1.Text);
    sb.AppendLine("brown");
    sb.AppendLine("brwn");
    
    textbox1.Text = sb.ToString();
    

    【讨论】:

    • 好答案,但构造函数名称与类名相同 - StringBuilder(缺少d):)
    【解决方案3】:

    \r\n 附加到字符串以将文本换行。

    textBox1.Text += ("brown\r\n");
    textBox1.Text += ("brwn");
    

    这将在不同的行上生成两个条目。

    【讨论】:

    • 不行,TextBox控件无法正确处理\n,必须使用\r\n,请自行检查
    • Environment.NewLine
    【解决方案4】:

    试试这个

    textBox1.Text += "SomeText\r\n" 
    

    你也可以试试

    textBox1.Text += "SomeText" + Environment.NewLine;
    

    \r 是回车,\n 是换行

    【讨论】:

      【解决方案5】:

      您必须直接使用文本框的AppendText 方法。如果您尝试使用 Text 属性,文本框将不会向下滚动,因为添加了新行。

      textBox1.AppendText("Hello" + Environment.NewLine);
      

      【讨论】:

        【解决方案6】:

        TextBox 的“Lines”属性是一个字符串数组。根据定义,您不能将元素添加到现有的 string[],就像您可以添加到 List<string> 一样。根本没有可用于此目的的方法。您必须改为基于当前 Lines 引用创建一个新的string[],并将其分配给 Lines。

        使用一点 Linq(.NET 3.5 或更高版本):

        textBox1.Lines = textBox.Lines.Concat(new[]{"Some Text"}).ToArray();
        

        此代码可以根据用户交互一次添加一个新行,但对于使用几十个新行初始化一个文本框,它的性能会很差。如果您要设置 TextBox 的初始值,我将直接使用 StringBuilder 设置 Text 属性(正如其他答案所提到的),或者如果您设置为操作 Lines 属性,请使用 List 来编译集合值,然后将其转换为数组以分配给 Lines:

        var myLines = new List<string>();
        
        myLines.Add("brown");
        myLines.Add("brwn");
        myLines.Add("brn");
        myLines.Add("brow");
        myLines.Add("br");
        myLines.Add("brw");
        ...
        
        textBox1.Lines = myLines.ToArray();
        

        即便如此,由于 Lines 数组是一个计算属性,这涉及到很多不必要的幕后转换。

        【讨论】:

          【解决方案7】:

          添加Environment.NewLine\r\n 最初不适用于我的文本框。我发现我忘记进入文本框的 Behavior 属性并将“Multiline”属性设置为“True”以添加行!我只是想我会添加这个警告,因为上面的答案中没有其他人做过,而且我以为盒子只是会自动扩展并忘记我需要实际设置 Mulitline 属性才能使其工作。我知道这是一种愚蠢的事情(这是周五下午晚些时候发生在我们身上的那种事情),但它可能有助于有人记得检查一下。此外,在外观部分是我需要设置为“Both”的“ScrollBars”属性,以获得水平和垂直条,以便文本可以真正滚动并完整查看。因此,这里的答案不仅仅是通过将Environment.NewLine\r\n 附加到.Text 的代码一,还要确保您的盒子正确设置了正确的属性。

          【讨论】:

            【解决方案8】:

            只需在文本中添加一个换行符即可。

            您不会将行添加为方法。多行只支持使用换行符。

            【讨论】:

              【解决方案9】:

              如果您知道需要多少行,请创建一个包含这么多成员的字符串数组(例如 myStringArray)。 然后使用 myListBox.Lines = myStringArray;

              【讨论】:

                【解决方案10】:

                以上方法对我不起作用。我遇到了以下异常:

                Exception : 'System.InvalidOperationException' in System.Windows.Forms.dll
                

                原来我需要先在我的控件上调用Invoke。见答案here

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2014-10-31
                  • 1970-01-01
                  • 1970-01-01
                  • 2013-05-04
                  • 2013-04-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多