在C#中更改多行文本框的特定行

3

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

假设多行文本框的第一行是“Hello”,第二行是“Bye”。但是当我尝试像下面这样更改第二行的值时:

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

当我在调试模式下查看结果时,它不是“Good bye”。

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

4个回答

5
如MSDN所述(您提供的链接):
默认情况下,行的集合是TextBox中行的只读副本。要获取可写的行集合,请使用类似以下代码:textBox1.Lines = new string[] { "abcd" };
因此,您必须“取出”Lines集合,更改它,然后返回到TextBox。可以通过以下方式实现:
var lines = TextBox1.Lines;
lines[1] = "GoodBye";
TextBox1.Lines = lines;

或者,你可以像Wolle建议的那样替换文本


1

首先,您需要将textBox1.Lines数组分配给变量。

string[] lines = textBox1.Lines; 

改变数组的值

lines[1] = "Good bye"; 

重新分配数组到文本框。
textBox1.Lines=lines; 

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

以那种方式处理行是一个非常糟糕的想法。 - arbiter

1

使用Lines属性处理TextBox的行非常低效。通过Text属性处理行会稍微好一些,但也不够高效。

下面是代码片段,可以替换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”?这真的可能吗?当表单上有两个文本框时,您需要额外的几个G内存吗?如果两个文本框都包含1KB的字符,那会怎样?这真的可能吗?我是代朋友询问的。 - Nino
是的,这是可能的。请查看我的答案以获得证明。至于通过“Lines”或“Text”进行工作,非常高的内存消耗(至少是通过“Lines”工作时的三倍)不是唯一的缺点。还有其他问题。 - arbiter
看起来你没有听懂这个笑话。我认为你的方法是不必要的,它会使代码变得复杂,比如说10行。Lines遍历字符数组,没有任何显著的性能问题。我想看到三倍时间的例子,特别是在现实数据中,而不是2GB的字符。而且,毕竟,如果文本框文本是应用程序的瓶颈,那么一个人应该放弃编程。 - Nino
我明白,但仍然确信使用正确的方法更好,几乎总是如此。当通过“行”更新“TextBox”时,您不需要2GB的字符才能感到痛苦,20-30KB的大量行就足够了,重置滚动位置和闪烁只是其中的几个问题。 - arbiter
好的,我同意正确的方法,但另一方面,在文本框中放置超过10行是错误的做法。文本框并不适合包含电子书,因此通过索引访问它的行似乎是过度工程化的。 - Nino
我几年前写了一个文本操作工具。它使用 TextBox.Lines 作为文本数据源进行操作。还有另一个 TextBox 用于将结果写入其中。对于几百行文本,它可以在没有显著延迟的情况下工作。然而,当我第一次需要处理数千行时,我遇到了困难。将 TextBox.Lines 替换为简单的 string [] 后,我可以在几秒钟内处理这些数据。现在,TextBoxes 仅用于通过 Paste 输入用户数据,并通过设置 Text 属性来显示最终结果。 - Vladimir.RL

0
你可以尝试像这样替换第二行的文本:
    var lines = textBox.Text.Split(new[] { '\r', '\n' }).Where(x => x.Length > 0);
    textBox.Text = textBox.Text.Replace(lines.ElementAt(1), "Good bye");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接