Winform RichTextBox 获取Text文本中段落及区块

在C# WinForms应用程序中,RichTextBox控件是一个功能强大的文本编辑控件,支持多种文本格式。如果你需要获取RichTextBox中每一部分的文本,包括段落和不同样式的区块,可以通过以下步骤实现。

总体思路是使用RichTextBoxRichTextBox.Find以及RichTextBox.SelectionStartRichTextBox.SelectionLength来逐个查找和获取不同样式的文本块。以下是一个完整的示例代码,演示了如何进行这些操作。

示例代码

using System;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace RichTextBoxExample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();

            // 初始化RichTextBox及其内容
            InitializeRichTextBox();
            // 获取RichTextBox中的所有文本块
            GetRichTextBlocks();
        }

        private void InitializeRichTextBox()
        {
            richTextBox1.AppendText("This is a regular text paragraph.\n");
            richTextBox1.AppendText("This is another regular text paragraph.\n");

            // 以不同的样式添加文本
            richTextBox1.SelectionFont = new Font(richTextBox1.Font, FontStyle.Bold);
            richTextBox1.AppendText("This is a bold text paragraph.\n");

            richTextBox1.SelectionFont = new Font(richTextBox1.Font, FontStyle.Italic);
            richTextBox1.AppendText("This is an italic text paragraph.\n");

            richTextBox1.SelectionFont = new Font(richTextBox1.Font, FontStyle.Underline);
            richTextBox1.AppendText("This is an underline text paragraph.\n");

            richTextBox1.SelectionFont = new Font(richTextBox1.Font, FontStyle.Regular);
            richTextBox1.AppendText("Back to regular text.\n");
        }

        private void GetRichTextBlocks()
        {
            StringBuilder sb = new StringBuilder();

            int textLength = richTextBox1.TextLength;
            int startIndex = 0;

            while (startIndex < textLength)
            {
                // 获取当前文本块的样式信息
                richTextBox1.Select(startIndex, 1);
                FontStyle currentStyle = richTextBox1.SelectionFont.Style;
                int blockStartIndex = startIndex;

                // 查找相同样式的文本块结束位置
                while (startIndex < textLength)
                {
                    richTextBox1.Select(startIndex, 1);
                    if (richTextBox1.SelectionFont.Style != currentStyle)
                    {
                        break;
                    }
                    startIndex++;
                }

                // 提取文本块
                int blockLength = startIndex - blockStartIndex;
                richTextBox1.Select(blockStartIndex, blockLength);
                string blockText = richTextBox1.SelectedText;

                // 打印或处理文本块
                sb.AppendLine($"Text Block: \"{blockText}\", Style: {currentStyle}");

                // 查找段落末尾,以换行符为标志
                if (blockText.Contains("\n"))
                {
                    int paragraphEnd = blockText.IndexOf("\n") + blockStartIndex + 1;
                    startIndex = paragraphEnd;
                }
            }

            // 显示所有文本块信息
            MessageBox.Show(sb.ToString());
        }
    }
}

代码解释

  1. 初始化RichTextBox

    • InitializeRichTextBox方法用于向RichTextBox中添加不同样式的文本。
    • 可以看到,使用richTextBox1.SelectionFont来设置不同的样式,然后使用richTextBox1.AppendText添加带不同样式的文本段落。
  2. 获取并处理文本块

    • GetRichTextBlocks方法用于逐个提取RichTextBox中的文本块。
    • 它使用一个循环,通过richTextBox1.SelectrichTextBox1.SelectionFont.Style来判断当前文本块的样式。
    • 找到同样式的连续文本块之后,通过richTextBox1.SelectedText来提取文本内容。
    • 检查这些文本块是否包含换行符,以便区分段落。
  3. 显示结果

    • 将所有提取的文本块及其样式信息通过StringBuilder收集,并最终使用MessageBox.Show展示。

通过这种方法,你可以提取并处理RichTextBox中的每个文本块,包括段落和不同样式的区块。如果需要进一步处理,例如保存到文件或其他数据结构,可以根据需要进行扩展。

posted @   DyanBlog  阅读(127)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示