C# 中是否有一种优雅的方式从多行文本框的开头删除多行文本?我正在使用 Microsoft Visual C# 2008 Express Edition。
编辑 - 其他详细信息 我的应用程序中的多行文本框被禁用(即它只能由应用程序本身编辑),并且每一行都以“\r\n”结尾。
这是一个不完整的问题。因此,假设您使用的是 TextBox 或 RichTextBox,您可以使用 TextBoxBase 中的 Lines 属性。
//get all the lines out as an arry
string[] lines = this.textBox.Lines;
然后,您可以使用此数组并将其重新设置。
this.textBox.Lines= newLinesArray;
这可能不是最优雅的方式,但它会删除第一行。 编辑:您不需要选择,只需使用跳过就可以了
//number of lines to remove from the beginning
int numOfLines = 30;
var lines = this.textBox1.Lines;
var newLines = lines.Skip(numOfLines);
this.textBox1.Lines = newLines.ToArray();
此解决方案在 WPF 中适用于我:
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}
您可以将 LogTextBox 替换为文本框的名称,将 Constants.LogMaximumLines 替换为您希望文本框拥有的最大行数。
不幸的是,不,无论您使用的是 ASP.NET、WinForms 还是 WPF/Silverlight,都没有从多行 TextBox 的文本中删除行的“优雅”方法。在每种情况下,您都构建一个不包含您不想要的行的字符串并设置 Text 属性。
WinForms 将通过使用 Lines 属性将 Text 值预拆分为行来为您提供一些帮助,但它不是很有帮助,因为它是一个字符串数组,并且删除数组的元素并不容易。
通常,此算法适用于 TextBox 类的所有可能版本:
var lines = (from item in myTextBox.Text.Split('\n') select item.Trim());
lines = lines.Skip(numLinesToSkip);
myTextBox.Text = string.Join(Environment.Newline, lines.ToArray());
注意:我专门针对 Unix 平台上的 Silverlight 使用 Environment.Newline。对于所有其他情况,在 string.Join 调用中使用 "\r\n" 完全没问题。
此外,我不认为这是一个优雅的解决方案,即使它只有 3 行。它的作用如下:
我不认为它很优雅,因为它本质上构建了两个单独的数组,然后从第二个数组构建了一个字符串。更优雅的解决方案不会这样做。
要记住的一件事是 TextBox 的 Lines 集合不能准确地反映用户所看到的线条。Lines 集合基本上是通过回车来工作的,而用户可以看到从一行到下一行的行没有回车。这可能是也可能不是您想要的行为。
例如,用户将以下内容视为三行,但 Lines 集合将显示 2(因为只有 2 个回车):
This is line number
one.
This is line 2.
此外,如果窗体和文本控件可调整大小,则文本中的可见行将随着控件的增大或缩小而改变。
几年前我写了一篇关于如何确定用户看到文本框中的行数并获取给定行的索引的博客文章(比如在索引处获取行:http ://ryanfarley.com/blog /archive/2004/04/07/511.aspx,也许这篇文章会有所帮助。
if (txtLog.Lines.Length > maxNumberLines)
{
txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}