如何在DevExpress RichEditControl中以编程方式合并数据?

如何在DevExpress RichEditControl中以编程方式合并数据?,devexpress,mailmerge,richedit-control,Devexpress,Mailmerge,Richedit Control,我希望允许用户从预定义模板列表中进行选择。选择模板后,RichEditControl(REC)将显示根据所选模板格式化的文档,其中的字段已合并。(用户从未看到合并文档的双括号“代码隐藏”)我的模板以varbinary的形式存在于数据库中,并以字节数组的形式传递给gui,该类的简化如下: public class Template { public byte[] Document {get;set;} } 在包含REC的表单中,我在事件处理程序中为包含可用模板的下拉列表中的已更改事件调用以下

我希望允许用户从预定义模板列表中进行选择。选择模板后,RichEditControl(REC)将显示根据所选模板格式化的文档,其中的字段已合并。(用户从未看到合并文档的双括号“代码隐藏”)我的模板以varbinary的形式存在于数据库中,并以字节数组的形式传递给gui,该类的简化如下:

public class Template
{
  public byte[] Document {get;set;}
}
在包含REC的表单中,我在事件处理程序中为包含可用模板的下拉列表中的已更改事件调用以下方法(letterWriterEditor是我的REC,templateBindingSource绑定到LetterWriterMergeFieldCollection,一个包含字符串属性的类,表示我希望在文档中合并的字段,以及该特定字母的值(在程序的其他地方确定)):

合并字段绑定良好:我可以使用REC功能区栏中的一个邮件按钮手动插入它们。但是,当我尝试以编程方式执行此操作时,文档最终为空。我希望在用户选择所需模板后,它最终成为一封合并信函,随时可以保存。我的理解是,使用ViewMergeData属性设置为true,这就是应该发生的情况


如果有人有任何想法,我将不胜感激。提前感谢。

我目前正在做类似的事情,我将模板加载到RichEditDocumentServer中(类似于RichEditControl,但没有UI)然后设置MailMerge的数据源,然后调用RichEditDocumentServer的MailMerge方法,并将RichEditControl的文档作为参数

RichEditDocumentServer加载模板并进行邮件合并,然后在表单的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);
}
之后,只需执行邮件合并并使用您的表单LetterWriteEditor显示:

docServer.MailMerge(letterWriterEditor.Document);

它应该可以工作。:

@Kuffs我使用的代码在上面——我问题的第二个代码块。我希望看到将我的模板(由template.Document提供)与LetterWriterMergeFieldCollection类提供的数据合并的结果。
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);
}
docServer.DataSource = templateBindingSource;
docServer.MailMerge(letterWriterEditor.Document);