4

可能重复:
为什么richtextbox 不能正确显示此表?

我们在 Visual Studio 2008 中遇到了 Windows.Forms.RichTextBox 控件的问题。

我们正在尝试在 Windows 窗体应用程序 (.NET 3.5) 中显示由第三方作为 RTF 文件提供的文本。在这个 RTF 文本文件中有表格,其中包含跨越多行的文本。使用写字板或 Word 2003 打开时,RTF 文件可以正确显示。

但是,当我们将 RTF 文件加载到 RichTextBox 控件中,或者将整个文本(包括表格)复制并粘贴到控件中时,表格无法正确显示 - 单元格只有单行,没有换行。

以下是显示确切问题的图像的链接:

我搜索了解决方案和第 3 方 .net RTF 控件,但没有成功。我在另一个论坛上发现了这个确切的问题,但没有答案(事实上这就是图片链接的来源)所以我希望堆栈溢出做得更好;-)

我首选的解决方案是使用可以正确呈现 RTF 的代码或第 3 方控件。但是,我怀疑问题在于 RichTextBox 控件仅支持完整 RTF 规范的子集,因此另一种选择是直接修改 RTF 以删除不受支持的控制代码或以其他方式修复 RTF 文件本身(在这种情况下,任何信息至于需要删除或修改哪些控制代码将是一个巨大的帮助)。

4

7 回答 7

3

.NET 的富文本框非常有问题。

在 RTF 中,定义表格的方式实际上与您习惯使用 HTML 时所期望的完全不同。

HTML:

<table>
<tr>
    <td>Mycell</td>
</tr>
</table>

在 RTF 中,表格只是一系列段落,其中包含定义行、单元格和边框的控制字。表格的开始/结束没有组标签。

RTF:

\trowd\trgraph \cellx1000 Mycell \cell\row\pard\par

如果要在单元格内添加段落,请使用 \par 和控件 \intbl (in table) 来指示段落在表格内。

.NET RTB 只能处理非常小的 RTF 控制字子集,并且不支持绝大多数可用命令。从表面上看,\intbl 是它不支持的一长串控制字的一部分,如果它实际上解析了 \par ,那么显示就会被破坏。

不幸的是,我没有解决方案,但我希望上面的小解释能帮助你理解这个问题。

不要太相信我的 RTF 样本。它有效,但它绝对是简单的。您可以从 Microsoft 网站下载 RTF 规范: Word 2007 RTF 规范

于 2009-02-04T08:01:08.877 回答
1

您可以使用旧的 COM 控件代替新的 .NET 控件,还是需要“纯”.NET 解决方案?

换句话说,进入 Visual Studio 工具箱,右键单击,选择“Choose Items”,查看 COM Components 选项卡并选中 Microsoft Rich Textbox Control 6.0。

于 2009-02-04T06:42:32.683 回答
1

Step 1,使用旧的COM Microsoft Rich Textbox Control 6.0;第二步,复制Windows\System32\MsftEdit.dll,然后重命名为riched20.dll;第 3 步,将riched20.dll 复制到您的应用程序文件夹,例如 bin\bebug。这工作正常,表格显示正确。

于 2009-04-20T13:35:34.577 回答
1

在这里回答我自己的问题,但只是由于 Joel 和 sylverdrag 的帮助......

简短的回答是 .Net 和底层 COM RichTextBox 都不支持表格中的自动换行。我最终敲开了一个测试应用程序并使用了 COM 和 .Net RichTextBox 控件,它们都表现出相同的(损坏的)行为。

我还从 sylverdrag 提供的链接下载了 RTF 规范,在修改了 MS Word 和 RichTextEdit 控件中的手工制作的 RTF 文档后,我可以确认 TichTextBox 不正确支持 \intbl 控制字 - 这是自动换行所必需的表。

似乎有三种可能的解决方案:

  1. 使用TX 文本控制。我已经使用试用版确认了这项工作,但价格昂贵 - 每位开发人员的起价为 549 美元。

  2. 使用Code Project中讨论的嵌入式 MS Word 实例。请注意,Code Project 上提供的代码示例不是开箱即用的,但我确实让它与 Office 2003 和 VS 2008 一起使用。经过一番折腾后,我们遇到了一个意外的显示停止 - 我们希望文档是只读的所以我们 Protect() 文件。虽然这可行,但当用户尝试编辑文档时,MS Word“保护文档”侧栏会从控件的右侧弹出。我们不能忍受这个,我无法关闭它(从谷歌搜索来看,我并不孤单)。

  3. 放弃 RTF 并改用 HTML,然后在 WebBrowser 控件而不是 RichTextEdit 控件中呈现文档。这是我们正在采用的选项,因为事实证明源文档可以以任何一种格式提供。

于 2009-02-06T06:45:49.540 回答
0

写字板通常是富编辑控件的一个非常薄的包装器,因此如果它在那里正确显示,那么 Windows 应该能够处理它。

也许您正在实例化错误版本的富编辑控件?有很多,Windows 继续提供旧版本以实现向后兼容性。 http://msdn.microsoft.com/en-us/library/bb787873(VS.85).aspx

于 2009-02-04T05:05:10.977 回答
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);

}
于 2010-06-04T09:23:14.520 回答
-1

这不是 .net 中提供的 RitchText Control 的问题。新版本的 Ms-office (2007) 中更改了一些 Ritchtext 规则 (Ritchtext Synatax)。但是 .net 中使用的组件无法更新以适应新规则,因此会出现问题。

阿南德

于 2009-12-28T06:42:06.740 回答