可能重复:
Why isn’t the richtextbox displaying this table properly?
我们在Visual Studio 2008中遇到了Windows.Forms.RichTextBox控件的问题。
我们正在尝试在Windows窗体应用程序(.NET 3.5)中显示第三方作为RTF文件提供的文本。在此RTF文本文件中,有表,其中包含跨越多行的文本。使用写字板或Word 2003打开时,RTF文件会正确显示。
但是,当我们将RTF文件加载到RichTextBox控件中时,或者复制&将整个文本(包括表格)粘贴到控件中,表格无法正确显示 - 单元格只是单行,没有包装。
以下是显示确切问题的图片链接:
我搜索了解决方案和第三方.net RTF控件但没有成功。我发现这个确切的问题在另一个没有答案的论坛上问(实际上这是图像链接的来源)所以我希望堆栈溢出做得更好;-)
我首选的解决方案是使用能够正确呈现RTF的代码或第三方控件。但是,我怀疑问题是RichTextBox控件只支持完整RTF规范的子集,因此另一个选项是直接修改RTF以删除不支持的控制代码或以其他方式修复RTF文件本身(在这种情况下任何信息)至于需要删除或修改哪些控制代码将是一个巨大的帮助。)
答案 0 :(得分:3)
.NET中的Rich Text框非常错误。
在RTF中,定义表的方式实际上与您习惯使用HTML时的预期完全不同。
HTML:
<table>
<tr>
<td>Mycell</td>
</tr>
</table>
在RTF中,表格只是一系列段落,控制字定义行,单元格,边框。表的开头/结尾没有组标签。
RTF:
\trowd\trgraph \cellx1000 Mycell \cell\row\pard\par
如果要在单元格内添加段落,可以使用\ par和control \ intbl(在表格中)来指示段落在表格内。
.NET RTB只能处理一小部分RTF控制字,并且不支持绝大多数可用命令。根据事物的外观,\ intbl是它不支持的长控制字列表的一部分,如果它实际上在那时解析\ par,则显示被删除。
不幸的是,我没有解决方案,但我希望上面的小解释可以帮助你理解问题。
不要过分相信我的RTF样本。它有效,但它绝对是骨头。您可以从Microsoft的网站下载RTF规范: Word 2007 RTF specs。
答案 1 :(得分:1)
您可以使用旧的COM控件而不是新的.NET控件,还是需要“纯”的.NET解决方案?
换句话说,进入Visual Studio工具箱,右键单击,选择“选择项目”,查看“COM组件”选项卡,然后选中“Microsoft Rich Textbox Control 6.0”。
答案 2 :(得分:1)
在这里回答我自己的问题,但仅仅是由于Joel和sylverdrag的帮助......
简短的回答是.Net和底层的COM RichTextBox都不支持表中的自动换行。我最终敲了一个测试应用程序并同时使用COM和.Net RichTextBox控件,它们都表现出相同(破碎)的行为。
我还从sylverdrag提供的链接下载了RTF规范,在修改了MS Word和RichTextEdit控件中的手工制作的RTF文档后,我可以确认TichTextBox没有正确支持\ intbl控制字 - 这是必需的表格中的自动换行。
似乎有三种可能的解决方案:
使用TX Text Control。我已经使用试用版确认了这项工作,但价格昂贵 - 每位开发人员的价格为549美元。
使用Code Project中讨论的嵌入式MS Word实例。请注意,代码项目中提供的代码示例并不是开箱即用的,但我确实使用了Office 2003&amp; VS 2008.经过多次捣乱后,我们遇到了一个意想不到的节目限制 - 我们希望文档是只读的,所以我们保护()文档。虽然这有效,但当用户尝试编辑文档时,MS Word“保护文档”侧栏会从控件的右侧弹出。我们不能忍受这种情况而且我无法将其关闭(并且通过谷歌搜索看起来我并不孤单)。
放弃RTF并改用HTML,然后在WebBrowser控件而不是RichTextEdit控件中呈现文档。这是我们正在采取的选项,因为事实证明源文档可以采用任何一种格式。
答案 3 :(得分:1)
步骤1,使用旧的COM Microsoft Rich Textbox Control 6.0; 步骤2,制作Windows \ System32 \ MsftEdit.dll的副本,然后将其重命名为riched20.dll; 步骤3,将riched20.dll复制到您的应用程序文件夹,例如bin \ bebug。 这样工作正常,表格显示正确。
答案 4 :(得分:0)
Wordpad通常是丰富的编辑控件的一个非常薄的包装器,所以如果它正确显示那么Windows应该能够处理它。
也许您正在实例化富编辑控件的错误版本?有很多,Windows继续提供较旧的向后兼容性。 http://msdn.microsoft.com/en-us/library/bb787873(VS.85).aspx
答案 5 :(得分:0)
只需创建一个新控件。它对我来说很好。
using System;
using System.ComponentModel;
using System.Windows.Forms;
using System.Runtime.InteropServices;
public class RichTextBox5 : RichTextBox {
private static IntPtr moduleHandle;
protected override CreateParams CreateParams {
get {
if (moduleHandle == IntPtr.Zero) {
moduleHandle = LoadLibrary("msftedit.dll");
if ((long)moduleHandle < 0x20) throw new Win32Exception(Marshal.GetLastWin32Error(), "Could not load Msftedit.dll");
}
CreateParams createParams = base.CreateParams;
createParams.ClassName = "RichEdit50W";
if (this.Multiline) {
if (((this.ScrollBars & RichTextBoxScrollBars.Horizontal) != RichTextBoxScrollBars.None) && !base.WordWrap) {
createParams.Style |= 0x100000;
if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) {
createParams.Style |= 0x2000;
}
}
if ((this.ScrollBars & RichTextBoxScrollBars.Vertical) != RichTextBoxScrollBars.None) {
createParams.Style |= 0x200000;
if ((this.ScrollBars & ((RichTextBoxScrollBars)0x10)) != RichTextBoxScrollBars.None) {
createParams.Style |= 0x2000;
}
}
}
if ((BorderStyle.FixedSingle == base.BorderStyle) && ((createParams.Style & 0x800000) != 0)) {
createParams.Style &= -8388609;
createParams.ExStyle |= 0x200;
}
return createParams;
}
}
// P/Invoke declarations
[DllImport("kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern IntPtr LoadLibrary(string path);
}
答案 6 :(得分:-1)
这不是.net中提供的RitchText Control的问题。一些Ritchtext规则(Ritchtext Synatax)在新版Ms-office(2007)中已被更改。但.net中使用的组件无法更新以满足新规则,因此问题就会出现。
阿南德