从C#中的多行文本框的开头删除行

在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. 

此外,如果表单和文本控件可resize,则文本中的可见行将随控件的增大或缩小而更改。

几年前我写了一篇关于如何在用户看到它们时确定文本框中的行数并获得给定行的索引的博客文章(比如获取索引处的行: 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(); }