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

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/2014671/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-06 22:41:17  来源:igfitidea点击:

Delete Lines From Beginning of Multiline Textbox in C#

c#textboxmultiline

提问by Jim Fell

Is there a graceful way in C# to delete multiple lines of text from the beginning of a multiline textbox? I am using Microsoft Visual C# 2008 Express Edition.

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

EDIT - Additional DetailsThe multiline textbox in my application is disabled (i.e. it is only editable by the application itself), and every line is terminated with a "\r\n".

编辑 - 其他详细信息我的应用程序中的多行文本框被禁用(即它只能由应用程序本身编辑),并且每一行都以“\r\n”结尾。

采纳答案by Stan R.

This is an incomplete question. So assuming you are using either TextBox or RichTextBox you can use the Lines property found inTextBoxBase.

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

//get all the lines out as an arry
string[] lines = this.textBox.Lines;

You can then work with this array and set it back.

然后,您可以使用此数组并将其重新设置。

  this.textBox.Lines= newLinesArray;

This might not be the most elegant way, but it will remove the first line. EDIT: you don't need select, just using skip will be fine

这可能不是最优雅的方式,但它会删除第一行。 编辑:您不需要选择,只需使用跳过就可以了

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

回答by Randolpho

Unfortunately, no, there is no "elegant" way to delete lines from the text of a multiline TextBox, regardless of whether you are using ASP.NET, WinForms, or WPF/Silverlight. In every case, you build a string that does not contain the lines you don't want and set the Text property.

不幸的是,不,无论您使用的是 ASP.NET、WinForms 还是 WPF/Silverlight,都没有从多行 TextBox 的文本中删除行的“优雅”方法。在每种情况下,您都会构建一个不包含不需要的行的字符串并设置 Text 属性。

WinForms will help you a little bit by pre-splitting the Text value into lines, using the Lines property, but it's not very helpful because it's a string array, and it's not exactly easy to delete an element of an array.

WinForms 将通过使用 Lines 属性将 Text 值预先拆分为行来帮助您,但它不是很有帮助,因为它是一个字符串数组,并且删除数组的元素并不容易。

Generally, this algorithm will work for all possible versions of the TextBox class:

通常,此算法适用于 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());

Note: I'm using Environment.Newline specifically for the case of Silverlight on a Unix platform. For all other cases, you're perfectly fine using "\r\n" in the string.Join call.

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

Also, I do not consider this an elegant solution, even though it's only 3 lines. What it does is the following:

此外,我不认为这是一个优雅的解决方案,即使它只有 3 行。它的作用如下:

  • splits the single string into an array of strings
  • iterates over that array and builds a second array that does not include the lines skipped
  • joins the array back into a single string.
  • 将单个字符串拆分为字符串数组
  • 迭代该数组并构建不包含跳过的行的第二个数组
  • 将数组连接回单个字符串。

I do not consider it elegant because it essentially builds two separate arrays, then builds a string from the second array. A more elegant solution would not do this.

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

回答by Ryan Farley

One thing to keep in mind is that the Lines collection of the TextBox does not accurately reflect what the user sees as lines. The Lines collection basically works off of carriage returns, whereas the user could see lines wrapping from one line to the next without a carriage return. This may or may not be the behavior you want.

要记住的一件事是,TextBox 的 Lines 集合不能准确反映用户看到的线条。Lines 集合基本上不需要回车,而用户可以看到从一行到下一行的行没有回车。这可能是也可能不是您想要的行为。

For example, the user would see the below as three lines, but the Lines collection will show 2 (since there are only 2 carriage returns):

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

This is line number 
one. 
This is line 2.

Also, if the form, and the text control are resizable the visible lines in the text will change as the control grows or shrinks.

此外,如果窗体和文本控件可调整大小,则文本中的可见行将随着控件的增大或缩小而变化。

I wrote a blog post several years ago on how to determine the number of lines in the textbox as the user sees them and get the index of a given line (like to get the line at index: http://ryanfarley.com/blog/archive/2004/04/07/511.aspx, perhaps this post will help.

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

回答by Vlad Sabev

This solution works for me in WPF:

这个解决方案在 WPF 中对我有用:

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

You can replace LogTextBox with the name of your text box, and Constants.LogMaximumLines with the maximum number of lines you would like your text box to have.

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

回答by Ash

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