在.NET RichTextBox中删除特定行

5
如何在RichTextBox中删除特定的文本行?
9个回答

6

另一个解决方案:

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

“吃掉换行符”块是做什么的?-1 +1 不会抵消吗?实际上它似乎会评估为 count += 0 ... - Dave Cousineau
好的,我明白了,长度不包括换行符,我漏掉了。 - Dave Cousineau

4
这也可以解决问题(如果您可以处理表单代码中的++等内容)。保持文本格式。只需记住,“只读”属性适用于您和用户。
richTextBox.SelectionStart = richTextBox.GetFirstCharIndexFromLine(your_line);
richTextBox.SelectionLength = this.richTextBox.Lines[your_line].Length+1;
this.richTextBox.SelectedText = String.Empty;

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

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/


仅提供链接的回答不够好。请编辑后,我会给您点赞的先生。 - Cary Bondoc

1

我不知道是否有一种简单的方法可以一步完成。您可以使用富文本框的.Text属性上的.Split函数来获取行数组。

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
随着行数的增加,这会变得越来越慢。 - David Basarab
你是正确的,我应该在里面加上一个警告,但对于合理数量的行(少于100行?),它应该没问题。 - TLiebe
我曾经尝试过这个。但它让我失去了RTF格式。 - Wesley Long

1
在文本范围内查找要删除的文本,可以在这里找到。将文本设置为空,现在它已经从文档中消失了。

1

基于tomanu的解决方案,但没有额外开销

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

请注意,这里的行数是行数-2。

这个代码对于框中的最后一行有效吗?我更喜欢 tomanu 的 int count = richTextBox.Lines[a_line].Length; 这一行。 - Dave Cousineau
通过我的测试运行它,不,它不行,虽然它可能与你在最后一行所说的有关,但我不确定那是什么意思。 - Dave Cousineau

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

2
当回答一个旧问题时,如果您包含一些上下文来解释您的答案如何帮助,那么您的答案对其他StackOverflow用户将会更有用。请参阅:如何撰写好答案 - David Buck

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)

这将从现有文本中删除所有格式。如果您不想删除格式,则必须选择“创建选择,然后清除选择”的路线。请参阅其他答案。 - 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);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接