C# 删除C中多行文本框开头的行
在C语言中,有没有一种优雅的方法可以从多行文本框的开头删除多行文本?我正在使用Microsoft Visual C 2008快速版 编辑-其他详细信息C# 删除C中多行文本框开头的行,c#,textbox,multiline,C#,Textbox,Multiline,在C语言中,有没有一种优雅的方法可以从多行文本框的开头删除多行文本?我正在使用Microsoft Visual C 2008快速版 编辑-其他详细信息 我的应用程序中的多行文本框被禁用,即它只能由应用程序本身编辑,并且每一行都以一个\r\n结尾。不幸的是,不,无论您使用的是ASP.NET、WinForms还是WPF/Silverlight,都无法从多行文本框的文本中删除行。在每种情况下,都会生成一个不包含不需要的行的字符串,并设置Text属性 WinForms将通过使用lines属性将文本值预拆
我的应用程序中的多行文本框被禁用,即它只能由应用程序本身编辑,并且每一行都以一个\r\n结尾。不幸的是,不,无论您使用的是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,专门用于Unix平台上的Silverlight。对于所有其他情况,在string.Join调用中使用\r\n完全可以
我也不认为这是一个优雅的解决方案,尽管它只有3行。它的作用如下:
将单个字符串拆分为字符串数组
迭代该数组并生成不包含跳过行的第二个数组
将数组重新合并为单个字符串。
我不认为它很优雅,因为它基本上构建了两个独立的数组,然后从第二个数组构建一个字符串。更优雅的解决方案无法做到这一点
这是一个不完整的问题。因此,假设您使用的是TextBox或RichTextBox,则可以使用 然后可以使用此数组并将其设置回原位 this.textBox.Lines= newLinesArray;
这可能不是最优雅的方式,但它将删除第一行。
编辑:您不需要选择,只需使用跳过即可
需要记住的一点是,TextBox的Lines集合不能准确地反映用户所看到的行。Lines集合基本上是在回车的情况下工作的,而用户可以看到行在没有回车的情况下从一行换行到下一行。这可能是你想要的行为,也可能不是 例如,用户将看到以下三行,但lines集合将显示2,因为只有2个回车:
This is line number
one.
This is line 2.
此外,如果窗体和文本控件可调整大小,则文本中的可见行将随着控件的增大或缩小而改变
几年前,我写了一篇博文,内容是关于如何在用户看到文本框时确定行数,并获取给定行的索引,就像获取索引处的行一样,这篇博文可能会有所帮助。这个解决方案在WPF中对我有效:
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}
您可以将LogTextBox替换为文本框的名称,将Constants.LogMaximumLines替换为希望文本框具有的最大行数。注意:WPF的TextBox不包含lines属性。这只适用于WinForms。谢谢,Stan,但我不理解示例中的line=>line部分。我尝试了lines.Skip30.Select31,lines.Count,但出现了错误。@Jim您只需要Skip30.SelectLine=>line。跳过意味着跳过30行,选择通常是一个转换,所以在这种情况下没有转换,我们只是选择后面的行。事实上.Select是多余的,我们甚至不需要它。我更新了我的答案。@StanR。当使用由应用程序本身日志条目填充的文本框时,此代码会导致位置从上到下连续切换。有没有办法在没有这种滚动行为的情况下执行同样的操作?我的应用程序中的多行文本框被禁用,即它只能由应用程序本身编辑,并且每一行都以一个\r\n结尾。我在最初的问题中添加了这一评论。谢谢你的提醒。
if (txtLog.Lines.Length > maxNumberLines)
{
txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}
while (LogTextBox.LineCount > Constants.LogMaximumLines)
{
LogTextBox.Text = LogTextBox.Text.Remove(0, LogTextBox.GetLineLength(0));
}
if (txtLog.Lines.Length > maxNumberLines)
{
txtLog.Lines = txtLog.Lines.Skip(txtLog.Lines.Length - maxNumberLines).ToArray();
}