2009-08-25 5 views

ответ

1

Я не знаю, если есть простой способ сделать это за один шаг. Вы можете использовать функцию .split на свойстве .text богатого текстового поля, чтобы получить массив строк

string[] lines = richTextBox1.Text.Split("\n".ToCharArray()) 

, а затем написать что-то, чтобы повторно собрать массив в одну текстовую строку после удаления строки вам хотел и скопировать его обратно в свойство .Text богатого текстового поля.

Вот простой пример:

 string[] lines = richTextBox1.Text.Split("\n".ToCharArray()); 


     int lineToDelete = 2;   //O-based line number 

     string richText = string.Empty; 

     for (int x = 0 ; x < lines.GetLength(0) ; x++) 
     { 
      if (x != lineToDelete) 
      { 
       richText += lines[ x ]; 
       richText += Environment.NewLine; 
      } 
     } 

     richTextBox1.Text = richText; 

Если форматированный текст ящик будет иметь более 10 строк или около того, было бы хорошей идеей использовать StringBuilder вместо строки, чтобы составить новый текст с.

+2

Это работает медленно, как число линий увеличилось. –

+0

Вы правы, и я должен был поместить предупреждение там, но для разумного количества линий (менее чем 100?) Оно должно быть в порядке. – TLiebe

+0

Я попробовал это один раз. Это укусило меня, потеряв форматирование RTF. –

1

Найти текст для удаления в текстовой области, найдено here Установите текст сливать, а теперь его нет формируют документ.

4

Другое решение:

private void DeleteLine(int a_line) 
{ 
    int start_index = richTextBox.GetFirstCharIndexFromLine(a_line); 
    int count = richTextBox.Lines[a_line].Length; 

    // Eat new line chars 
    if (a_line < richTextBox.Lines.Length - 1) 
    { 
     count += richTextBox.GetFirstCharIndexFromLine(a_line + 1) - 
      ((start_index + count - 1) + 1); 
    } 

    richTextBox.Text = richTextBox.Text.Remove(start_index, count); 
} 
+0

Что делает блок «eat new line chars»? не отменяет -1 +1? казалось бы оценить, 'кол + = 0 'на самом деле ... –

+0

хорошо я понимаю, длина никак иначе не включает в себя конец строки символов, пропустил это. –

2

Попробуйте это:

Dim lst As New ListBox 
     Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click 
      Me.Controls.Add(lst) 
      For Each cosa As String In Me.RichTextBox1.Lines 
       lst.Items.Add(cosa) 
      Next 
      lst.Items.RemoveAt(2) 'the integer value must be the line that you want to remove -1 
      Me.RichTextBox1.Text = String.Empty 
      For i As Integer = 0 To lst.Items.Count - 1 
       If Me.RichTextBox1.Text = String.Empty Then 
        Me.RichTextBox1.Text = lst.Items.Item(i) 
       Else 
        MeMe.RichTextBox1.Text = Me.RichTextBox1.Text & Environment.NewLine & lst.Items.Item(i).ToString 
       End If 
      Next 
     End Sub 

http://social.msdn.microsoft.com/Forums/en-US/vbgeneral/thread/63647481-743d-4e55-9043-e0db5106a03a/

+0

Ссылка только ответ не очень хорошо.: D Отредактируйте это, и я буду голосовать за вас, сэр. –

+1

@ CaryBondoc сделано, спасибо за информацию –

2

на основе решения tomanu, но без накладных

int start_index = LogBox.GetFirstCharIndexFromLine(linescount); 
int count = LogBox.GetFirstCharIndexFromLine(linescount + 1) - start_index; 
LogBox.Text = LogBox.Text.Remove(start_index, count); 

отмечают, что м у linescount здесь linescount - 2.

+0

делает ли это работу для последней строки в поле? Мне нравится tomanu 'int count = richTextBox.Lines [a_line] .Length;' строка лучше. –

+0

@Sahuagin Я не помню ... – Cynede

+0

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

2

Это также может сделать трюк (если вы можете справиться такие вещи, как ++ в кодовых формах). Сохраняет текстовый формат. Просто помните, что атрибут «ReadOnly» работает как для вас, так и для пользователя.

richTextBox.SelectionStart = richTextBox.GetFirstCharIndexFromLine(your_line); 
richTextBox.SelectionLength = this.richTextBox.Lines[your_line].Length+1; 
this.richTextBox.SelectedText = String.Empty; 
+0

Это единственный подход, который не удаляет форматирование из существующего текста. Установка свойства Text очищает все существующее форматирование. Также обратите внимание, что если ваше текстовое поле только для чтения, установите Readonly на false перед изменением SelectedText, а затем восстановите Readonly до true после него. – Tombala

0

Вот моя реализация протестированных модулей.

public static void DeleteLine([NotNull] this RichTextBox pRichTextBox, int pLineIndex) { 
    if (pLineIndex < 0 || pLineIndex >= pRichTextBox.Lines.Length) 
     throw new InvalidOperationException("There is no such line."); 

    var start = pRichTextBox.GetFirstCharIndexFromLine(pLineIndex); 
    var isLastLine = pLineIndex == pRichTextBox.Lines.Length - 1; 
    var nextLineIndex = pLineIndex + 1; 

    var end = isLastLine 
     ? pRichTextBox.Text.Length - 1 
     : pRichTextBox.GetFirstCharIndexFromLine(nextLineIndex) - 1; 

    var length = end - start + 1; 
    pRichTextBox.Text = pRichTextBox.Text.Remove(start, length); 
} 

испытания Единица измерения:

(используется \n вместо Environment.NewLine, так как, по крайней мере для меня RTB автоматически заменяя \r\n только с \n)

[TestMethod] 
public void TestDeleteLine_SingleLine() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "This is line1.\n"; 
    rtb.DeleteLine(0); 
    var expected = ""; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod] 
public void TestDeleteLine_BlankLastLine() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "\n"; 
    rtb.DeleteLine(1); 
    var expected = "\n"; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod] 
public void TestDeleteLine_SingleLineNoEOL() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "This is line1."; 
    rtb.DeleteLine(0); 
    var expected = ""; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod] 
public void TestDeleteLine_FirstLine() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "This is line1.\nThis is line2.\nThis is line3."; 
    rtb.DeleteLine(0); 
    var expected = "This is line2.\nThis is line3."; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod] 
public void TestDeleteLine_MiddleLine() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "This is line1.\nThis is line2.\nThis is line3."; 
    rtb.DeleteLine(1); 
    var expected = "This is line1.\nThis is line3."; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod] 
public void TestDeleteLine_LastLine() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "This is line1.\nThis is line2.\nThis is line3."; 
    rtb.DeleteLine(2); 
    var expected = "This is line1.\nThis is line2.\n"; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod] 
public void TestDeleteLine_OneBlankLine() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "\n"; 
    rtb.DeleteLine(0); 
    var expected = ""; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod] 
public void TestDeleteLine_BlankLines() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "\n\n\n\n\n"; 
    rtb.DeleteLine(2); 
    var expected = "\n\n\n\n"; 
    Assert.AreEqual(expected, rtb.Text); 
} 

[TestMethod, ExpectedException(typeof(InvalidOperationException))] 
public void TestDeleteLine_Exception_BeforeFront() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "\n\n\n\n\n"; 
    rtb.DeleteLine(-1); 
} 

[TestMethod, ExpectedException(typeof(InvalidOperationException))] 
public void TestDeleteLine_Exception_AfterEnd() { 
    var rtb = new RichTextBox(); 
    rtb.Text = "\n\n"; 
    rtb.DeleteLine(3); 
} 
0

Много хороших ответов, но я нахожу много далеко не сложно.

string[] LinesArray = this.richTextBox1.Lines; 

this.richTextBox1.Clear(); 

for (int line = 0; line < LinesArray.Length; line++) 
{ 
if (!LinesArray[line].Contains("< Test Text To Remove >")) 
{ 
this.richTextBox1.AppendText(LinesArray[line] + Environment.NewLine); 
} 
} 

Я надеюсь, что это помогает другим некоторые; 0)

+0

Удаляет все форматирование из существующего текста. Если вы не хотите удалять форматирование, вам нужно идти по маршруту «Создать выделение, а затем очистить выделение». См. Другие ответы. – Tombala