从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();
不幸的是,无论您是使用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行。它所做的是以下情况:
- 拆分单一字符串转换成字符串
- 遍历数组的数组,并建立第二阵列不包括行跳过
- 加入阵列回成单个字符串。
我不认为它是优雅的,因为它基本上构建了两个单独的数组,然后从第二个数组构建一个字符串。更优雅的解决方案不会这样做。
对于适用于所有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,也许这篇文章。将帮助
这是一个有效的观点。 – 2010-01-06 17:40:21
我应用程序中的多行文本框是禁用的(即它只能由应用程序本身编辑),并且每行都以“\ 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();
}
注意:WPF的TextBox不包含Lines属性。这将只适用于WinForms。 – Randolpho 2010-01-06 17:26:21
谢谢,斯坦,但我不明白你的例子中的“line => line”部分。我尝试lines.Skip(30).Select(31,lines.Count()),但它错了。 – 2010-01-06 17:32:42
@Jim你只需要跳过(30)。选择(line => line)。跳过表示跳过30行,而选择通常是转换,所以在这种情况下没有转换,我们只是选择其余的行。实际上.Select是多余的,我们甚至不需要它。我更新了我的答案。 – 2010-01-06 17:35:37