2

ユーザーが定義済みのテンプレートのリストから選択できるようにしたいと考えています。テンプレートが選択されると、リッチエディット コントロール (REC) は、選択されたテンプレートに従って書式設定されたドキュメントを表示し、フィールドは既に結合されています。(ユーザーはマージ ドキュメントの二重括弧の「コード ビハインド」を見ることはありません。) 私のテンプレートは varbinary としてデータベースにあり、クラスのバイト配列として gui に渡されます。クラスは次のようになります。

public class Template
{
  public byte[] Document {get;set;}
}

REC を含むフォームで、使用可能なテンプレートを含むドロップダウンの変更イベントのイベント ハンドラーで次のメソッドを呼び出しています (letterWriterEditor は私の REC であり、templateBindingSource は LetterWriterMergeFieldCollection にバインドされています)。この特定の文字の値 (プログラムの他の場所で決定されます) とともに、ドキュメントでマージするオプションが必要なフィールドを表す文字列プロパティを含むクラス):

 public void MergeTemplateFieldsWithValues(IList<LetterWriterMergeFieldCollection> mergeValues, Template template)
    {
        using (Stream s = new MemoryStream(template.Document))
        {
            letterWriterEditor.LoadDocument(s, DocumentFormat.Rtf);
        }

        BindingList<LetterWriterMergeFieldCollection> bindingList = new BindingList<LetterWriterMergeFieldCollection>(mergeValues);
        templateBindingSource.DataSource = bindingList;
        templateBindingSource.ResetBindings(false);
    }

このフォームのコンストラクターには次のステートメントがあります。

 letterWriterEditor.Options.MailMerge.ViewMergedData = true;

マージ フィールドは適切にバインドされています。REC のリボン バーにある [メーリング] ボタンの 1 つを使用して手動で挿入できます。しかし、プログラムで行おうとすると、ドキュメントは空白になります。ユーザーが目的のテンプレートを選択するとすぐに、マージされたレターとして保存できるようにしたいと思います。私の理解では、ViewMergeData プロパティを true に設定すると、これが起こるはずです。

誰かに何かアイデアがあれば、私は感謝します。前もって感謝します。

4

1 に答える 1

3

私は現在似たようなことをしています。私の場合、RichEditDocumentServer (RichEditControl に似ていますが、UI はありません) 内にテンプレートをロードし、MailMerge の DataSource を設定します。その後、RichEditDocumentServer の MailMerge メソッドを呼び出し、RichEditControl のドキュメントをパラメータ。

RichEditDocumentServer はテンプレートを読み込み、MailMerge を実行してから、フォームの RichEditControl にドキュメントを表示します。

これを試すことができます:

フォームで RichEditDocumentServer を宣言します。

RichEditDocumentServer docServer;

そして、フォーム コンストラクターまたは OnLoad で初期化します。

docServer = New RichEditDocumentServer();

次に、次のようにメソッドを変更します。

public void MergeTemplateFieldsWithValues(IList<LetterWriterMergeFieldCollection> mergeValues, Template template)
    {
        using (Stream s = new MemoryStream(template.Document))
        {
        docServer.LoadDocument(s, DocumentFormat.Rtf);
    }

    BindingList<LetterWriterMergeFieldCollection> bindingList = new BindingList<LetterWriterMergeFieldCollection>(mergeValues);
    templateBindingSource.DataSource = bindingList;
    templateBindingSource.ResetBindings(false);
}

フィールドをドキュメントのどこにバインドしたかはわかりませんが、templateBindingSource がそれを行うと思うので、docServer の DataSource を設定するだけです。

docServer.DataSource = templateBindingSource;

その後、MailMerge を実行し、フォーム letterWriterEditor を使用して表示します。

docServer.MailMerge(letterWriterEditor.Document);

それはうまくいくはずです。:)

于 2012-09-10T19:18:33.030 に答える