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

时间:2012-06-30 04:07:56

标签: devexpress mailmerge richedit-control

我想允许用户从预定义模板列表中进行选择。选择模板后,RichEditControl(REC)将显示根据所选模板格式化的文档,并且已合并了字段。 (用户永远不会看到合并文档的双括号“代码隐藏”。)我的模板作为varbinary存在于数据库中,并作为字节数组传递给gui作为一个类,它被剥离,如下所示: / p>

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的功能区栏中的一个Mailings按钮手动插入它们。但是当我尝试以编程方式执行此操作时,该文档最终变为空白。一旦用户选择了所需的模板,我希望它最终成为准备好保存的合并信。我的理解是,将ViewMergeData属性设置为true,这就是应该发生的事情。

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

1 个答案:

答案 0 :(得分:3)

我目前正在做类似的事情,在我的情况下,我将模板加载到RichEditDocumentServer(类似于RichEditControl,但没有UI),然后设置MailMerge的DataSource,之后只需调用RichEditDocumentServer的MailMerge方法并给出RichEditControl的文档作为参数。

RichEditDocumentServer加载模板,然后MailMerge在Form的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);

它应该工作。 :)