2009-02-04 41 views
4

可能重複:
Why isn’t the richtextbox displaying this table properly?破錶(自動換行)

在Visual Studio中的Windows.Forms.RichTextBox控制

我們遇到了問題,2008年

我們試圖顯示第三方在Windows窗體應用程序(.NET 3.5)中作爲RTF文件提供的文本。在這個RTF文本文件中有表格,其中包含跨越多行的文本。使用寫字板或Word 2003打開時,RTF文件可以正確顯示。

但是,當我們將RTF文件加載到RichTextBox控件中,或複製&將整個文本(包括表格)粘貼到控件中時,表格會不能正確顯示 - 單元格只有單行,沒有包裝。

下面是指向圖像顯示確切的問題:

我用Google搜索解決方案和第三方.NET RTF控件沒有成功。我發現這個問題在另一個論壇上沒有答案(實際上這是圖像鏈接的來源),所以我希望堆棧溢出效果更好; - )

我的首選解決方案是使用代碼或者可以正確呈現RTF的第三方控件。但是,我懷疑問題是RichTextBox控件只支持完整RTF規範的一個子集,所以另一種選擇是直接修改RTF以刪除不支持的控制代碼或者修復RTF文件本身(在這種情況下,任何信息至於什麼控制代碼需要刪除或修改將是一個巨大的幫助)。

回答

0

寫字板通常是一個非常薄的包裝豐富的編輯控制,所以如果它出現在那裏,然後Windows應該能夠處理它。

也許你正在實例化富編輯控件的錯誤版本?已經有很多了,而且Windows爲了向後兼容而繼續提供舊的。 http://msdn.microsoft.com/en-us/library/bb787873(VS.85).aspx

+0

但寫字板不是用.NET編寫的,所以它會使用不同的富編輯控件嗎? 我想有可能.NET RichTextBox控件是一個圍繞本機控件的.NET包裝,但我會想如果是這種情況,那麼這個問題就不會發生。 – 2009-02-04 05:42:14

1

您可以使用舊的COM控件而不是新的.NET控件,還是需要「純」的.NET解決方案?

換句話說,進入Visual Studio工具箱,右鍵單擊,選擇「選擇項目」,查看COM組件選項卡,然後選中Microsoft Rich TextBox Control 6.0。

+0

謝謝喬爾,我剛剛給出了一個去,但不幸的COM控制(這是很難找到,因爲它被稱爲「MSREdit」)行爲完全相同。淨一。 這似乎證實了我最初使用googling這個問題時所閱讀的內容 - .Net控件基於COM控件。 – 2009-02-04 08:48:00

3

.NET中的富文本框太麻煩了。

在RTF中,表格的定義方式實際上與您使用HTML時所期望的完全不同。

HTML:

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

在RTF,一個表僅僅是一系列與控制字定義行,單元格邊框段落。表格的開始/結束沒有組標記。

RTF:

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

如果你想添加一個單元格中的段落,您使用\面值和控制\ intbl(表),表示該段是在表內。

.NET RTB只能處理一小部分RTF控制字,並不支持絕大多數可用命令。從外觀上看,\ intbl是它不支持的長長的控制字列表的一部分,如果它真正解析\ par在那個點上,則顯示被丟棄。

不幸的是,我沒有解決方案,但我希望上面的小解釋可以幫助你理解這個問題。

不要對我的RTF示例過於信任。它有效,但它絕對是毫無用處的。您可以從微軟網站下載RTF規範: Word 2007 RTF specs

1

這裏回答我的問題,而只是由於從喬爾和sylverdrag幫助...

簡短的回答是,無論是.Net和底層的COM RichTextBox中不支持自動換行的表。我最終敲了一個測試應用程序,並使用COM和.Net RichTextBox控件,他們都表現出相同(破碎)的行爲。

我還從sylverdrag提供的鏈接下載了RTF規範,並且在MS Word和RichTextEdit控件中修改了手工製作的RTF文檔後,我可以確認TichTextBox不能正確支持\ intbl控制字 - 這是必需的用於表格中的單詞包裝。

看來有三種可能的解決方案:

  1. 使用TX Text Control。我已經使用試用版證實了此作品,但價格昂貴 - 每個開發人員的價格最高爲549美元。

  2. 使用嵌入式MS Word實例,如Code Project所述。請注意,代碼示例提供的代碼示例沒有開箱即用,但我確實得到了它與Office 2003 & VS 2008的協同工作。經過大量的工作,我們碰到了一個意外的阻止 - 我們希望文檔是隻讀的所以我們保護()文檔。雖然這起作用,但當用戶嘗試編輯文檔時,MS Word「保護文檔」側欄會從控件的右側彈出。我們無法忍受這一點,我無法關閉它(並且從Google上看起來我並不孤單)。

  3. 在RTF上放棄並改用HTML,然後在WebBrowser控件中而不是RichTextEdit控件中呈現文檔。這是我們正在採用的選項,因爲它證明源文檔可以以任一格式提供。

1

步驟1,使用舊的Microsoft Microsoft Rich TextBox Control 6.0; 步驟2,製作Windows \ System32 \ MsftEdit.dll的副本,然後將其重命名爲riched20。DLL; 第3步,將riched20.dll複製到您的應用程序文件夾,如bin \ bebug。 這工作正常,表格正確顯示。

+0

謝謝陽光。我還沒有嘗試過,不幸的是,它可能不是我們有部署限制的選項。值得注意的是,下次還有人幫助任何人閱讀這條消息。 – 2009-04-29 07:45:40

-1

這不是在.net中提供的RitchText控件的問題。在新版本的Ms-office(2007)中,一些Ritchtext規則(Ritchtext Synatax)已被更改。然而,.net中使用的組件無法更新以迎合新規則,因此問題會發生。

Anand

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); 

} 
+0

[Attribution is required](http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/194f563c-205f-41a1-9582-4f03fd3a53c2/) – LarsTech 2013-03-07 22:49:29