【发布时间】:2017-05-22 12:06:03
【问题描述】:
我无法更改多行文本框的特定字符串。
假设多行文本框的第一行是"Hello",第二行是"Bye"。但是当我试图改变第二行的值时,如下所示。
textBox1.Lines[1] = "Good bye";
当我看到使用调试模式的结果时,它不是“再见”。
我也阅读了这篇MSDN 文章和这个stackoverflow 问题,但无法得到想要的答案。
【问题讨论】:
我无法更改多行文本框的特定字符串。
假设多行文本框的第一行是"Hello",第二行是"Bye"。但是当我试图改变第二行的值时,如下所示。
textBox1.Lines[1] = "Good bye";
当我看到使用调试模式的结果时,它不是“再见”。
我也阅读了这篇MSDN 文章和这个stackoverflow 问题,但无法得到想要的答案。
【问题讨论】:
正如 MSDN 所述(您提供的链接):
默认情况下,行集合是 TextBox 中行的只读副本。 要获得可写的行集合,请使用代码 类似于以下内容: textBox1.Lines = new string[] { "abcd" };
所以,你必须“取”Lines 集合,更改它,然后返回到TextBox。可以这样实现:
var lines = TextBox1.Lines;
lines[1] = "GoodBye";
TextBox1.Lines = lines;
或者,您可以替换文本,例如 Wolle suggested
【讨论】:
首先你需要在变量中分配textBox1.Lines数组
string[] lines = textBox1.Lines;
更改数组值
lines[1] = "Good bye";
将数组重新分配给文本框
textBox1.Lines=lines;
根据MSDN
默认情况下,行的集合是行的只读副本 在文本框中。要获得可写的行集合,需要分配 新建字符串数组
【讨论】:
通过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 的字符?有可能吗?求朋友。
Lines 或Text 工作,非常高的内存消耗(通过Lines 工作时至少要三倍)不是唯一的缺点。还有其他的。
Lines 遍历没有任何重大性能问题的 char 数组。我希望看到三倍时间的例子,尤其是现实生活中的 dara,而不是 2 场 chars。而且,毕竟,如果 texbox 文本是应用程序的瓶颈,就应该放弃编程
Lines更新TextBox时不需要2gb的字符感到痛苦,20-30kb的行就足够了,重置滚动位置和闪烁只是少数要命名的。
您可以尝试像这样替换第二行的文本:
var lines = textBox.Text.Split(new[] { '\r', '\n' }).Where(x => x.Length > 0);
textBox.Text = textBox.Text.Replace(lines.ElementAt(1), "Good bye");
【讨论】: