如何从richbox中删除空行

时间:2011-04-23 11:21:54

标签: c#

我的richbox中有几个空白行,我需要将它们从rich中删除。

我可以删除空行但不能删除它们。我该怎么做?我使用了这段代码,但它不起作用:

RichTextBox rtfBox = new RichTextBox();
rtfBox.Rtf = SOME NTEXT DATA;

int lineNumber = 0;
foreach (string a in rtfBox.Lines)
{
    if (a == "")
    {
        int start_index = rtfBox.GetFirstCharIndexFromLine(lineNumber);
        int countLineChar = rtfBox.Lines[lineNumber].Length;
        // Eat new line chars
        if (lineNumber < rtfBox.Lines.Length - 1)
        {
            countLineChar += rtfBox.GetFirstCharIndexFromLine(lineNumber + 1) -
                ((start_index + countLineChar - 1) + 1);
        }
        rtfBox.Text = rtfBox.Text.Remove(start_index, countLineChar);
    }
    else
        lineNumber++;
}

此行rtfBox.Text = rtfBox.Text.Remove(start_index, countLineChar);不起作用。

感谢

更新

谢谢大家,当richbox内容只是文本时,你的建议很有用,但我的富人也有图片和表格。当我使用rtb.Text =或rtfBox.Text =或richTextBox1.Text =图像和表格将从richbox中删除。

5 个答案:

答案 0 :(得分:4)

这将匹配包含一个新行字符的任何行,optionaly以任何空格开头;

rtb.Text = Regex.Replace(rtb.Text, @"^\s*$(\n|\r|\r\n)", "", RegexOptions.Multiline);

(就像其他文字&amp;替换这将打破任何格式,如果有的话)

答案 1 :(得分:0)

从此question

我不知道是否有一个简单的方法可以一步到位。您可以在富文本框的.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 :(得分:0)

很难确切地说出你在做什么,但看起来你正在环绕外部foreach的线路并看着rtfBox.Lines看看这个是否......我不知道......这部分很奇怪。然后你正在改变rtfBox.Text

即使你的内在逻辑是正确的,这也行不通。设置rtfBox.Text时,更改要循环的项目。然后你继续处理一份无关紧要的原件。

我建议你不要这样做...不要担心Lines集合只是根据你的需要修复Text。这是一个建议(我没有测试)

rtfBox.Text = rtfBox.Text.Replace("\r\n\r\n","\r\n");
rtfBox.Text = refBox.Text.Replace("\n\n","\n");

甚至更好

rtfBox.Text = refBox.Text.Replace(Environement.NewLine+Environement.NewLine,Environement.NewLine);

你可能不得不将它们放在循环中,直到找不到匹配项。

例如

string doubleNewLine = Environement.NewLine+Environement.NewLine;
while (rtfBox.Text.Contains(doubleNewLine)
{
   refBox.Text = refBox.Text.Replace(doubleNewLine,Environement.NewLine);
}
// deal with special case of text box starting with newline.

答案 3 :(得分:0)

这将删除文本中的所有行:

string value = Regex.Replace(someText, @"(\n|\r)", "", RegexOptions.Multiline);

答案 4 :(得分:0)

我遇到了同样的问题。我的Windows窗体上有一个富文本框(rtb),用于通过复制/粘贴输入信息。如果用户碰巧出现空白行并将该数据粘贴到rtb中。如何清理rtb,所以它只有几行有用的数据。我的过程有些不同。

                string[] lines = RichTextBox1.Lines.ToArray(); //This is to split the rich text box into an array
                string richText = string.Empty;
                foreach (string line in lines)
                {
                    if (!string.IsNullOrEmpty(line))
                    {//Here is were you re-build the text in the rich text box with lines that have some data in them
                        richText += line;
                        richText += Environment.NewLine;
                    }
                    else
                        continue;
                }
                richText = richText.Substring(0, richText.Length - 2); //Need to remove the last Environment.NewLine, else it will look at it as an other line in the rick text box.
                RichTextBox1.Text = richText;