4

重複の可能性:
リッチテキストボックスにこのテーブルが正しく表示されないのはなぜですか?

VisualStudio2008のWindows.Forms.RichTextBoxコントロールに問題があります。

Windowsフォームアプリケーション(.NET 3.5)で、サードパーティからRTFファイルとして提供されたテキストを表示しようとしています。このRTFテキストファイルには、複数行にまたがるテキストを含むテーブルがあります。ワードパッドまたはワード2003で開いた場合、RTFファイルは正しく表示されます。

ただし、RTFファイルをRichTextBoxコントロールにロードするか、テキスト全体(テーブルを含む)をコピーしてコントロールに貼り付けると、テーブルは正しく表示されません。セルは1行だけで、折り返しはありません。

正確な問題を示す画像へのリンクは次のとおりです。

私は解決策とサードパーティの.netRTFコントロールをグーグルで検索しましたが成功しませんでした。私はこの正確な問題が答えなしで別のフォーラムで尋ねられているのを見つけました(実際にはそこから画像へのリンクがあります)ので、スタックオーバーフローがより良くなることを望んでいます;-)

私の好ましい解決策は、RTFを正しくレンダリングできるコードまたはサードパーティのコントロールを使用することです。ただし、問題は、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 (テーブル内) を使用して、段落がテーブル内にあることを示します。

.NET RTB は、RTF コントロール ワードの非常に小さなサブセットしか処理できず、使用可能なコマンドの大部分をサポートしていません。一見すると、\intbl はサポートされていない制御語の長い長いリストの一部であり、その時点で実際に \par を解析すると、表示が破棄されます。

残念ながら、それに対する解決策はありませんが、上記の簡単な説明が問題の理解に役立つことを願っています.

私の RTF サンプルを信用しすぎないでください。それは機能しますが、それは絶対に必要最小限です。RTF 仕様は、Microsoft の Web サイト Word 2007 RTF仕様 からダウンロードできます。

于 2009-02-04T08:01:08.877 に答える
1

ここで私自身の質問に答えますが、それはJoelとsylverdragの助けによるものです...

簡単に言うと、.Netと基盤となるCOM RichTextBoxはどちらも、テーブルでのワードラップをサポートしていません。最終的にテストアプリケーションをノックアップし、COMコントロールと.Net RichTextBoxコントロールの両方を使用しましたが、どちらも同じ(壊れた)動作を示しました。

また、sylverdragが提供するリンクからRTF仕様をダウンロードし、MS WordおよびRichTextEditコントロールで手作りのRTFドキュメントをいじった後、TichTextBoxが\intblコントロールワードを正しくサポートしていないことを確認できます。これはワードラップインに必要です。テーブル。

3つの可能な解決策があるようです:

  1. TXテキストコントロールを使用します。試用版を使用してこれが機能することを確認しましたが、高価です。価格は開発者1人あたり549米ドルからです。

  2. Code Projectで説明されているように、埋め込みMSWordインスタンスを使用します。Code Projectで提供されているコード例は、そのままでは機能しませんでしたが、Office2003およびVS2008で機能するようになりました。何度もいじくり回した後、予期しないショーストッパーが発生しました。ドキュメントを読み取り専用にする必要があります。したがって、ドキュメントをProtect()します。これが機能している間、ユーザーがドキュメントを編集しようとすると、MSWordの「ドキュメントの保護」サイドバーがコントロールの右側から飛び出します。私たちはこれと一緒に暮らすことができず、私はそれをオフにすることができませんでした(そしてグーグルからそれは私が一人ではないように見えます)。

  3. RTFをあきらめて、代わりにHTMLを使用してから、RichTextEditコントロールではなくWebBrowserコントロールでドキュメントをレンダリングします。これは、ソースドキュメントがどちらの形式でも利用できることが判明したために採用しているオプションです。

于 2009-02-06T06:45:49.540 に答える
1

新しい .NET コントロールの代わりに古い COM コントロールを使用できますか、それとも「純粋な」.NET ソリューションが必要ですか?

つまり、Visual Studio ツールボックスに移動し、右クリックして [項目の選択] を選択し、[COM コンポーネント] タブを見て、[Microsoft Rich Textbox Control 6.0] を確認します。

于 2009-02-04T06:42:32.683 に答える
1

ステップ 1、古い COM Microsoft Rich Textbox Control 6.0 を使用します。ステップ 2、Windows\System32\MsftEdit.dll のコピーを作成し、名前を riched20.dll に変更します。ステップ 3、riched20.dll を bin\bebug などのアプリ フォルダーにコピーします。これは正常に機能し、テーブルが正しく表示されます。

于 2009-04-20T13:35:34.577 に答える
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 に答える
0

ワードパッドは通常、リッチ エディット コントロールの非常に薄いラッパーであるため、そこに適切に表示されれば、Windows はそれを処理できるはずです。

おそらく、リッチ エディット コントロールの間違ったバージョンをインスタンス化していますか? 多くのものがあり、Windows は下位互換性のために古いものを提供し続けています。 http://msdn.microsoft.com/en-us/library/bb787873(VS.85).aspx

于 2009-02-04T05:05:10.977 に答える
-1

これは .net で提供される RitchText Control の問題ではありません。新しいバージョンの Ms-office (2007) では、いくつかの Ritchtext ルール (Ritchtext Synatax) が変更されました。ただし、.net で使用されるコンポーネントは、新しいルールに対応するために更新できないため、問題が発生します。

アナンド

于 2009-12-28T06:42:06.740 に答える