How can I delete a specific line of text in a RichTextBox ?
9 Answers
Another solution:
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);
}

- 51
- 1
- 2
-
what does the "eat new line chars" block do? doesn't the -1 +1 cancel out? it would seem to evaluate to `count += 0` actually... – Dave Cousineau Nov 27 '15 at 18:30
-
ok I get it, the length doesn't otherwise include the end of line characters, missed that. – Dave Cousineau Nov 27 '15 at 18:42
This also could do the trick (if you can handle things such as ++ in forms code). Keeps the text format. Just remember "ReadOnly" attribute work for both you and user.
richTextBox.SelectionStart = richTextBox.GetFirstCharIndexFromLine(your_line);
richTextBox.SelectionLength = this.richTextBox.Lines[your_line].Length+1;
this.richTextBox.SelectedText = String.Empty;

- 3,271
- 3
- 29
- 48
-
This is the only approach that does not remove formatting from existing text. Setting the Text property clears all existing formatting. Also to note, if your textbox is readonly, set Readonly to false just before modifying SelectedText, then restore Readonly to true after it. – Tombala Oct 24 '16 at 13:38
Try this:
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/

- 5,971
- 11
- 42
- 80
-
Link only answer is not good. :D Edit it and I'll up vote you Sir. – Cary Bondoc Nov 09 '15 at 03:02
Based on tomanu's solution but without overhead
int start_index = LogBox.GetFirstCharIndexFromLine(linescount);
int count = LogBox.GetFirstCharIndexFromLine(linescount + 1) - start_index;
LogBox.Text = LogBox.Text.Remove(start_index, count);
note that my linescount here is linescount - 2.

- 32,616
- 62
- 183
- 313
-
does this work for the last line in the box? I like tomanu's `int count = richTextBox.Lines[a_line].Length;` line better. – Dave Cousineau Nov 27 '15 at 18:26
-
running it through my tests, no it doesn't, though it might be related to what you say in the last line, not sure what that means. – Dave Cousineau Dec 01 '15 at 16:30
I don't know if there is an easy way to do it in one step. You can use the .Split function on the .Text property of the rich text box to get an array of lines
string[] lines = richTextBox1.Text.Split( "\n".ToCharArray() )
and then write something to re-assemble the array into a single text string after removing the line you wanted and copy it back to the .Text property of the rich text box.
Here's a simple example:
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;
If your rich text box was going to have more than 10 lines or so it would be a good idea to use a StringBuilder instead of a string to compose the new text with.

- 7,913
- 1
- 23
- 28
-
2
-
You're right and I should have put a warning in there but for a reasonable number of lines (less than 100?) it should be fine. – TLiebe Aug 25 '09 at 16:54
-
Find the text to delete in a text range, found here Set the text to empty, and now it is gone form the document.

- 1
- 1

- 72,212
- 42
- 129
- 156
int LineToDelete = 50;
List<string> lines = richTextBox1.Lines.ToList();
lines.Remove(LineToDelete);
richTextBox1.Lines = lines.ToArray();

- 11
- 1
-
2When answering an old question, your answer would be much more useful to other StackOverflow users if you included some context to explain how your answer helps. See: [How do I write a good answer](https://stackoverflow.com/help/how-to-answer). – David Buck Jan 24 '20 at 20:46
Here is my unit tested implementation.
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);
}
Unit tests:
(used \n
instead of Environment.NewLine
since at least for me RTB is automatically replacing \r\n
with just \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);
}

- 12,154
- 8
- 64
- 80
Lots of good answers, but I find many far to complicated.
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);
}
}
I hope this helps others some ;0)

- 2,692
- 3
- 34
- 55
-
This removes all formatting from the existing text. If you don't want to remove formatting, you have to go with the route of "Create a selection, then clear the selection". See other answers. – Tombala Oct 24 '16 at 13:36