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 标签!!
我想将格式化文本和 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 标签!!