简体   繁体   中英

Delete a specific line in a .NET RichTextBox

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

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

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;

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/

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.

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.

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

int LineToDelete = 50;
List<string> lines = richTextBox1.Lines.ToList();
lines.Remove(LineToDelete);
richTextBox1.Lines = lines.ToArray();

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

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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM