Delete a specific line in a .NET RichTextBox

后端 未结 9 1616
后悔当初
后悔当初 2021-01-19 15:08

How can I delete a specific line of text in a RichTextBox ?

9条回答
  •  萌比男神i
    2021-01-19 15:26

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

提交回复
热议问题