在C#中有一种优雅的方式可以从多行文本框的开头删除多行文本吗?我使用的是Microsoft Visual C#2008 Express Edition。
编辑 - 其他详细信息 我的应用程序中的多行文本框被禁用(即它只能由应用程序本身编辑),并且每行都以“\ r \ n”结束。
答案 0 :(得分:14)
这是一个不完整的问题。因此,假设您使用的是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();
答案 1 :(得分:8)
此解决方案适用于WPF:
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}
您可以使用文本框的名称替换LogTextBox,并使用您希望文本框具有的最大行数替换Constants.LogMaximumLines。
答案 2 :(得分:5)
不幸的是,不,无论您使用的是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行。它的作用如下:
我不认为它很优雅,因为它基本上构建了两个独立的数组,然后从第二个数组构建一个字符串。更优雅的解决方案不会这样做。
答案 3 :(得分: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,也许这篇文章会有所帮助。答案 4 :(得分:1)
if (txtLog.Lines.Length > maxNumberLines)
{
txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}