【问题标题】:How do I programmatically merge data in DevExpress RichEditControl?如何以编程方式合并 DevExpress RichEditControl 中的数据?
【发布时间】:2012-09-11 09:25:04
【问题描述】:

我希望允许用户从预定义模板列表中进行选择。选择模板后,RichEditControl (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 功能区栏中的“邮件”按钮之一手动插入它们。但是当我尝试以编程方式执行时,文档最终是空白的。我希望它最终成为一个合并的字母,一旦用户选择所需的模板就可以保存。我的理解是,将 ViewMergeData 属性设置为 true,这就是应该发生的事情。

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

【问题讨论】:

  • @Kuffs 我使用的代码在上面——我的问题中的第二个代码块。我期待看到将我的模板(由 Template.Document 提供)与由 LetterWriterMergeFieldCollection 类提供的数据合并的结果。

标签: devexpress mailmerge richedit-control


【解决方案1】:

我目前正在做类似的事情,在我的情况下,我将模板加载到 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);

它应该工作。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-31
    • 2012-06-09
    • 1970-01-01
    • 2015-08-29
    • 2021-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多