删除.NET RichTextBox中的特定行

问题描述:

如何删除RichTextBox中的特定行文本?删除.NET RichTextBox中的特定行

我不知道是否有一个简单的方法来做到这一步。您可以使用.Split功能上的丰富文本框。文本属性来获取线

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

的数组,然后写的东西去掉,你行后,重新组装阵列成一个单一的文本字符串并将其复制回富文本框的.Text属性。

这里有一个简单的例子:如果您的富文本框将不得不超过10行左右,这将是使用StringBuilder而不是字符串来组成新的文本是一个好主意

 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; 

用。

+2

这会很慢作为线的数量增加。 – 2009-08-25 16:48:05

+0

你是对的,我应该在那里提出一个警告,但对于合理数量的行(少于100?)应该没问题。 – TLiebe 2009-08-25 16:54:52

+0

我试过一次。它让我失去了我的RTF格式。 – 2016-01-15 17:39:39

查找要在文本范围内删除的文本,找到here将文本设置为空,现在它从文档中消失。

另一种解决方案:

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

“吃新的字符”块有什么作用?不是-1 +1取消了吗?它似乎实际上评估为“计数+ = 0”...... – 2015-11-27 18:30:15

+0

好的我明白了,长度不包括行尾字符,错过了。 – 2015-11-27 18:42:04

试试这个:基于tomanu的解决方案,但没有开销

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

注意m

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编辑它,我会投票给你,先生。 – 2015-11-09 03:02:59

+1

@CaryBondoc完成了,感谢信息 – 2015-11-09 10:00:34

y linescount here is linescount - 2.

+0

是否为盒子中的最后一行工作?我喜欢tomanu的'int count = richTextBox.Lines [a_line] .Length;'更好。 – 2015-11-27 18:26:29

+0

@Sahuagin我不记得... – Cynede 2015-11-30 04:45:51

+0

通过我的测试运行它,不,它不会,虽然它可能与你在最后一行说的内容有关,但不确定这意味着什么。 – 2015-12-01 16:30:04

这也可以做到这一点(如果你可以在窗体代码中处理诸如++之类的东西)。保持文本格式。只记得您和用户的“只读”属性。

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

这是不从现有文本中删除格式的唯一方法。设置Text属性将清除所有现有的格式。还要注意,如果您的文本框是只读的,请在修改SelectedText之前将Readonly设置为false,然后在它之后将Readonly恢复为true。 – Tombala 2016-10-24 13:38:37

这是我的单元测试的实现。

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); 
} 

单元测试:

[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); 
} 

很多好的答案(因为至少使用\n代替Environment.NewLine我RTB自动与刚刚\n更换\r\n),但我发现很多很复杂。

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 2016-10-24 13:36:55