richTextBox - 添加文本和 table

richTextBox - add text and table

我想将格式化文本和 table 添加到 richTextBox。

为此,我使用这些代码:

正文:

richTextBox1.SelectionFont = new Font("Maiandra GD", 30, FontStyle.Bold);
richTextBox1.SelectionColor = Color.Red;
richTextBox1.SelectionIndent = 0;
richTextBox1.AppendText("text text text");

和 table:

StringBuilder tableRtf = new StringBuilder();

tableRtf.Append(@"{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 Microsoft Sans Serif;}}");
for (int j = 0; j <5; j++)
{
    tableRtf.Append(@"\trowd");
    tableRtf.Append(@"\cellx2500" + "  ghhghgjghjghjhggjh");
    tableRtf.Append(@"\intbl\cell");
    tableRtf.Append(@"\cellx10000\intbl\cel");
    tableRtf.Append("   " + "sdfsdfs" + @"\intbl\clmrg\cell\row");
}

tableRtf.Append(@"\pard");
tableRtf.Append(@"}");
richTextBox1.Rtf=tableRtf.ToString();

但是

richTextBox1.Rtf=tableRtf.ToString();

删除之前的内容

如何使它们兼容?


它不是重复的,因为我想要两件事:

1) 以这种方式向 richTextBox 添加格式化文本:

richTextBox1.SelectionFont = new Font("Maiandra GD", 30, FontStyle.Bold);
richTextBox1.SelectionColor = Color.Red;
richTextBox1.AppendText("text text text");

可读性好,修改方便。

2) 我想添加 tables.

所以结构:

正文正文正文正文正文 文字文字文字文字文字

|TABLE|

正文正文正文正文正文 文字文字文字文字文字文字 文字文字文字文字文字

|TABLE|

等等

但我不知道如何应用 tables 而不丢失以前的内容?

您需要做的是将 rtf 代码分解为 header 和正文。

table body 从循环开始,保留 \par 肯定是个好主意。

但您既不能替换旧文本,也不能简单地将 body 附加到末尾。

相反,您需要将它插入 最后一个卷曲 之前!这是因为最后一个卷曲 标志着整个 rtf 代码的结尾 并且它之后的任何内容都将被忽略!

这很简单。

对于完整的解决方案,您还需要组合 headers。

这需要做更多的工作,将其全部写出来会超出 SO 答案的范围。

但基本原理很简单:

您需要了解您的 table header 添加到原始 header.

中的内容

最常见的是一个font table和一个color table

所以如果你想在附加的 table 中使用一种或多种不同的字体,你需要这样做:

  • 使用新的字体索引将它们添加到字体 table 中,例如作为前一个分号后的 \f1\fnil Consolas;
  • 通过更改循环以在第一个 \intbl table-paragraph-formatting 控制字之后包含新字体来使用它:\intbl\f2\fs24 ghhghgjghjghjhggjh.
  • 如果您想在 table 中使用不同的字体,请根据需要重复。
  • 如果需要,添加 cfN 字体颜色选择器。

同样的想法也适用于颜色 table。它没有明确的索引,所以顺序很重要;附加所有颜色,每个颜色末尾有一个分号:

{\colortbl ;\red255\green0\blue0;\red25\green0\blue220;}

..将格式化文本中的红色添加蓝色。

你看,这是工作,需要一些努力和准备。

您可以在此处找到完整的 rtf 规范。

这里是用rtf..玩一点的截图:

注意tableheader的部分是由控件创建的;您可能想为此使用一个虚拟控件,或者您可以弄清楚哪些部分是您需要的,哪些不是必需的..

更新:这是一个'appending rtf for dummies'版本:

tableRtf.Append(@"{\fonttbl{\f0\fnil\fcharset0 Courier;}}");
for (int j = 0; j <5; j++)
{
    tableRtf.Append(@"\trowd");
    tableRtf.Append(@"\cellx2500" + "  ghhghgjghjghjhggjh");
    tableRtf.Append(@"\intbl\cell");
    tableRtf.Append(@"\cellx10000\intbl\cel");
    tableRtf.Append("   " + "sdfsdfs" + @"\intbl\clmrg\cell\row");
}

tableRtf.Append(@"\pard");
tableRtf.Append(@"}");

string rtf1 = richTextBox1.Rtf.Trim().TrimEnd('}');
string rtf2 = tableRtf.ToString();
richTextBox1.Rtf  = rtf1 + rtf2;

请注意,在 table body 之前插入的字体 table 确实有效!但请确保不要添加 rtf-start 标签!!