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

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

РЕДАКТИРОВАНИЕ - Дополнительные Детали, многострочное текстовое поле в моем приложении отключено (т.е. это только доступно для редактирования самим приложением) и каждая строка завершаются с "\r\n".

11
задан Brian Tompsett - 汤莱恩 6 July 2015 в 11:23
поделиться

3 ответа

Это неполный вопрос. Предполагая, что вы используете 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();
15
ответ дан 3 December 2019 в 02:52
поделиться

Следует помнить, что коллекция 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, возможно, этот пост поможет.

1
ответ дан 3 December 2019 в 02:52
поделиться

К сожалению, нет, не существует "элегантного" способа удаления строк из текста многострочного TextBox, независимо от того, используете ли вы 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 специально для случая Silverlight на платформе Unix. Во всех остальных случаях вы вполне можете использовать "\ r \ n" в вызове string.Join.

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

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

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

5
ответ дан 3 December 2019 в 02:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: