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

问题描述:

C#中从多行文本框的开头删除多行文本有没有优雅的方式?我正在使用Microsoft Visual C#2008速成版。从C#中的多行文本框开始删除行

编辑 - 其他详细 在我的应用程序中的多行TextBox被禁止(即,它是仅由应用程序本身可编辑),并且每行端接一个为“\ r \ n”个。

这是一个不完整的问题。所以假设你使用的是TextBox或RichTextBox,你可以使用Lines property found inTextBoxBase

//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(); 
+0

注意:WPF的TextBox不包含Lines属性。这将只适用于WinForms。 – Randolpho 2010-01-06 17:26:21

+0

谢谢,斯坦,但我不明白你的例子中的“line => line”部分。我尝试lines.Skip(30).Select(31,lines.Count()),但它错了。 – 2010-01-06 17:32:42

+0

@Jim你只需要跳过(30)。选择(line => line)。跳过表示跳过30行,而选择通常是转换,所以在这种情况下没有转换,我们只是选择其余的行。实际上.Select是多余的,我们甚至不需要它。我更新了我的答案。 – 2010-01-06 17:35:37

不幸的是,无论您是使用ASP.NET,WinForms还是WPF/Silverlight,不存在“优雅”的方式来删除多行文本框中的行。在任何情况下,您都会创建一个不包含不需要的行的字符串,并设置Text属性。

WinForms将通过使用Lines属性将文本值预分割成行来帮助您一点点,但它不是非常有用,因为它是一个字符串数组,并且删除数组元素并不容易。

一般来说,这种算法将用于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()); 

注:我使用Environment.Newline专门的Silverlight在Unix平台上的情况。对于所有其他情况,使用string.Join调用中的“\ r \ n”完全可以。

此外,我不认为这是一个优雅的解决方案,即使它只有3行。它所做的是以下情况:

  • 拆分单一字符串转换成字符串
  • 遍历数组的数组,并建立第二阵列不包括行跳过
  • 加入阵列回成单个字符串。

我不认为它是优雅的,因为它基本上构建了两个单独的数组,然后从第二个数组构建一个字符串。更优雅的解决方案不会这样做。

+0

对于适用于所有TextBox类的变体+1。 – 2010-01-06 17:38:27

有一点要记住的是,该文本框的线条收集并不能准确反映用户所认为的线。 Lines集合基本上不受回车的影响,而用户可以看到从一行到下一行的换行,而无需回车。这可能是也可能不是你想要的行为。

例如,用户将看到下面的三个线,但是在线路集合将显示2(因为只有2回车):

This is line number 
one. 
This is line 2. 

而且,如果形式,和文本控件的大小会随着控件的增长或缩小而改变。

几年前,我写了一篇博客文章,介绍如何确定文本框中的行数,当用户看到它们并获得给定行的索引时(例如获取索引处的行:http://ryanfarley.com/blog/archive/2004/04/07/511.aspx,也许这篇文章。将帮助

+0

这是一个有效的观点。 – 2010-01-06 17:40:21

+0

我应用程序中的多行文本框是禁用的(即它只能由应用程序本身编辑),并且每行都以“\ r \ n”结尾。 (我已经将此评论添加到了我的最初问题中。)感谢您的高举。 – 2010-01-06 17:41:47

该解决方案在WPF工作对我来说:

while (LogTextBox.LineCount > Constants.LogMaximumLines) 
{ 
    LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0)); 
} 

您可以用文本框的名称替换LogTextBox,并与行的最大数量Constants.LogMaximumLines你想你的文本框

if (txtLog.Lines.Length > maxNumberLines) 
{ 
    txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray(); 
}