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

15

在C#中,是否有一种优雅的方式从多行文本框的开头删除多行文本? 我正在使用Microsoft Visual C# 2008 Express Edition。

编辑 - 额外说明 我的应用程序中的多行文本框是禁用的(即仅由应用程序本身进行编辑),每行都以“\r\n”结尾。

5个回答

21

这是一个不完整的问题。假设您正在使用TextBox或RichTextBox,您可以使用在TextBoxBase中找到的Lines属性

//get all the lines out as an arry
string[] lines = this.textBox.Lines;
你可以使用这个数组并将其设置回去。
  this.textBox.Lines= newLinesArray;

这可能不是最优雅的方式,但它将删除第一行。 编辑:您无需使用 select,只使用 skip 就可以了。

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

1
注意:WPF的TextBox控件不包含Lines属性。这只适用于WinForms。 - Randolpho
谢谢,Stan,但我不理解你示例中的“line => line”部分。我尝试了lines.Skip(30).Select(31, lines.Count())但出现错误。 - Jim Fell
@Jim,你只需要Skip(30).Select(line => line)。Skip的意思是跳过30行,而Select通常是一种转换操作,但在这种情况下我们只是选择剩余的行。实际上,.Select是多余的,我们甚至不需要它。我更新了我的答案。 - Stan R.
1
@StanR。当使用应用程序自动填充文本框(日志条目)时,此代码会导致位置不断从顶部切换到底部。有没有一种方法可以在不出现滚动行为的情况下实现相同的效果? - Timo

8
这个解决方案适用于我在WPF中的情况:
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
    LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}

您可以将LogTextBox替换为文本框的名称,并将Constants.LogMaximumLines替换为您想要文本框拥有的最大行数。

7
很遗憾,无论您是使用ASP.NET、WinForms还是WPF/Silverlight,都没有一种“优雅”的方法可以从多行文本框的文本中删除行。在每种情况下,您需要构建一个不包含您不想要的行的字符串,并设置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());

注意:我专门使用Environment.Newline来处理在Unix平台上的Silverlight情况。对于其他情况,您可以在string.Join调用中完全使用"\r\n"。
另外,即使这只是三行代码,我也不认为这是一种优雅的解决方案。它的功能如下:
- 将单个字符串拆分为字符串数组 - 遍历该数组并构建一个不包括跳过行的第二个数组 - 将数组合并回单个字符串
我认为它不够优雅,因为它本质上构建了两个独立的数组,然后从第二个数组构建字符串。更加优雅的解决方案不会这样做。

1

记住一件事,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),也许这篇文章会有所帮助。


我的应用程序中的多行文本框已被禁用(即它只能由应用程序本身进行编辑),每行都以“\r\n”结尾。(我已将此注释添加到我的初始问题中。)感谢您的提示。 - Jim Fell

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接