【问题标题】:Change Particular line of Multiline textbox in C#在 C# 中更改多行文本框的特定行
【发布时间】:2017-05-22 12:06:03
【问题描述】:

我无法更改多行文本框的特定字符串。

假设多行文本框的第一行是"Hello",第二行是"Bye"。但是当我试图改变第二行的值时,如下所示。

textBox1.Lines[1] = "Good bye";

当我看到使用调试模式的结果时,它不是“再见”。

我也阅读了这篇MSDN 文章和这个stackoverflow 问题,但无法得到想要的答案。

【问题讨论】:

    标签: c# winforms textbox


    【解决方案1】:

    正如 MSDN 所述(您提供的链接):

    默认情况下,行集合是 TextBox 中行的只读副本。 要获得可写的行集合,请使用代码 类似于以下内容: textBox1.Lines = new string[] { "abcd" };

    所以,你必须“取”Lines 集合,更改它,然后返回到TextBox。可以这样实现:

    var lines = TextBox1.Lines;
    lines[1] = "GoodBye";
    TextBox1.Lines = lines;
    

    或者,您可以替换文本,例如 Wolle suggested

    【讨论】:

      【解决方案2】:

      首先你需要在变量中分配textBox1.Lines数组

      string[] lines = textBox1.Lines; 
      

      更改数组值

      lines[1] = "Good bye"; 
      

      将数组重新分配给文本框

      textBox1.Lines=lines; 
      

      根据MSDN

      默认情况下,行的集合是行的只读副本 在文本框中。要获得可写的行集合,需要分配 新建字符串数组

      【讨论】:

      • 以这种方式处理线条是一个非常糟糕的主意。
      【解决方案3】:

      通过Lines 属性使用TextBox非常无效。通过Text 属性处理线条会好一些,但也无效。

      这里是 sn-p,它允许您替换 TextBox 中的一行而不重写整个内容:

      public static bool ReplaceLine(TextBox box, int lineNumber, string text)
      {
          int first = box.GetFirstCharIndexFromLine(lineNumber);
          if (first < 0)
              return false;
      
          int last = box.GetFirstCharIndexFromLine(lineNumber + 1);
      
          box.Select(first,
              last < 0 ? int.MaxValue : last - first - Environment.NewLine.Length);
          box.SelectedText = text;
      
          return true;
      }
      

      【讨论】:

      • 那么,如果使用Lines 是无效的,并且使用Text 也是无效的,你如何使用TextBox?有可能吗?当表单上有两个文本框时,您是否需要一些额外的 RAM?什么是两个文本框都包含 1 kB 的字符?有可能吗?求朋友。
      • 是的,有可能。查看我的答案以获取证据。至于通过LinesText 工作,非常高的内存消耗(通过Lines 工作时至少要三倍)不是唯一的缺点。还有其他的。
      • 看来你没听懂这个笑话。我认为您的方法不需要使代码复杂化,例如 10 行。 Lines 遍历没有任何重大性能问题的 char 数组。我希望看到三倍时间的例子,尤其是现实生活中的 dara,而不是 2 场 chars。而且,毕竟,如果 texbox 文本是应用程序的瓶颈,就应该放弃编程
      • 我明白了,但仍然确信使用正确的方法会更好,嗯,几乎总是如此。通过Lines更新TextBox时不需要2gb的字符感到痛苦,20-30kb的行就足够了,重置滚动位置和闪烁只是少数要命名的。
      • 好的,我同意正确的方法,但另一方面,在文本框中放置超过 10 行是错误的方法。文本框并不意味着包含电子书,因此按索引访问它的行似乎是过度设计。
      【解决方案4】:

      您可以尝试像这样替换第二行的文本:

          var lines = textBox.Text.Split(new[] { '\r', '\n' }).Where(x => x.Length > 0);
          textBox.Text = textBox.Text.Replace(lines.ElementAt(1), "Good bye");
      

      【讨论】:

        猜你喜欢
        • 2017-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-05-31
        • 2014-01-22
        • 1970-01-01
        • 1970-01-01
        • 2013-04-03
        相关资源
        最近更新 更多