Удалить строки с начала многострочного текстового поля в C #

Есть ли в C # изящный способ удалить несколько строк текста из начала многострочного текстового поля? Я использую Microsoft Visual C # 2008 Express Edition.

ИЗМЕНИТЬ - Дополнительные сведения. Многострочное текстовое поле в моем приложении отключено (т. е. оно доступно для редактирования только самим приложением), и каждая строка заканчивается знаком «\ r \ n».


person Jim Fell    schedule 06.01.2010    source источник


Ответы (4)


Это неполный вопрос. Итак, если вы используете TextBox или RichTextBox, вы можете использовать Свойство Lines найдено вTextBoxBase.

//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();
person Stan R.    schedule 06.01.2010
comment
ПРИМЕЧАНИЕ. Текстовое поле WPF не содержит свойства Lines. Это будет работать только для WinForms. - person Randolpho; 06.01.2010
comment
Спасибо, Стэн, но я не понимаю строку = ›часть вашего примера. Я пробовал lines.Skip (30) .Select (31, lines.Count ()), но с ошибкой. - person Jim Fell; 06.01.2010
comment
@Jim вам нужен только Skip (30) .Select (line = ›line). Пропустить означает пропустить 30 строк, а Select обычно является преобразованием, поэтому в этом случае преобразования нет, мы просто выбираем оставшиеся после него строки. На самом деле .Select избыточен, и он нам даже не нужен. Я обновил свой ответ. - person Stan R.; 06.01.2010
comment
@StanR. При работе с текстовым полем, которое заполняется самим приложением (записи журнала), этот код заставляет положение постоянно переключаться сверху вниз. Есть ли способ сделать то же самое без этой прокрутки? - person Timo; 27.10.2011

Это решение работает для меня в WPF:

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

Вы можете заменить LogTextBox именем своего текстового поля, а Constants.LogMaximumLines - максимальным количеством строк, которое вы хотели бы иметь в текстовом поле.

person Vlad Sabev    schedule 23.07.2011

К сожалению, нет, не существует "элегантного" способа удаления строк из текста многострочного TextBox, независимо от того, используете ли вы ASP.NET, WinForms или WPF / Silverlight. В каждом случае вы создаете строку, не содержащую ненужных строк, и устанавливаете свойство Text.

WinForms немного поможет вам, предварительно разделив значение Text на строки, используя свойство 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. Во всех остальных случаях вы вполне можете использовать "\ r \ n" в вызове string.Join.

Также я не считаю это изящным решением, хотя это всего 3 строчки. Он делает следующее:

  • разбивает одну строку на массив строк
  • выполняет итерацию по этому массиву и строит второй массив, который не включает пропущенные строки
  • объединяет массив обратно в одну строку.

Я не считаю это элегантным, потому что он по сути строит два отдельных массива, а затем строит строку из второго массива. Более элегантное решение этого не сделает.

person Randolpho    schedule 06.01.2010

Следует иметь в виду, что коллекция Lines TextBox не точно отражает то, что пользователь видит как строки. Коллекция Lines в основном работает с возвратом каретки, тогда как пользователь мог видеть перенос строк от одной строки к другой без возврата каретки. Это может быть, а может и не быть тем поведением, которое вы хотите.

Например, пользователь увидит ниже три строки, но в коллекции Lines будет отображаться 2 (поскольку есть только 2 возврата каретки):

This is line number 
one. 
This is line 2.

Кроме того, если размер формы и текстового элемента управления можно изменять, видимые строки в тексте будут изменяться по мере увеличения или уменьшения элемента управления.

Несколько лет назад я написал сообщение в блоге о том, как определить количество строк в текстовом поле, когда их видит пользователь, и получить индекс данной строки (например, получить строку по индексу: http://ryanfarley.com/blog/archive/2004/04/07/511.aspx , возможно, этот пост поможет.

person Ryan Farley    schedule 06.01.2010
comment
Многострочное текстовое поле в моем приложении отключено (т.е. оно доступно для редактирования только самим приложением), и каждая строка заканчивается символом \ r \ n. (Я добавил этот комментарий к своему первоначальному вопросу.) Спасибо за внимание. - person Jim Fell; 06.01.2010