2012-06-30 245 views
2

我想让用户从预定义的模板列表中进行选择。选择模板后,RichEditControl(REC)将显示根据所选模板格式化的文档,其中已经合并了字段。 (用户从来不会看到合并文档的双括号“代码隐藏”。)我的模板以varbinary形式存在数据库中,并作为类中的字节数组传递给gui,拆分后的形式如下所示:如何以编程方式合并DevExpress RichEditControl中的数据?

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; 

字段绑定精细合并:我可以用在拍摄的功能条的邮件按钮之一,手动插入。但是当我尝试以编程的方式完成这个文档时,这个文档就变成了空白。当用户选择所需的模板时,我希望它最终成为一个合并的信件,随时可以保存。我的理解是,将ViewMergeData属性设置为true,这就是应该发生的事情。

如果有人有任何想法,我会很感激。提前致谢。

+0

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

回答

3

我目前正在做类似的事情,在我的情况下,我加载RichEditDocumentServer(这就像一个RichEditControl,但没有用户界面)模板,然后设置MailMerge的数据源,之后,只需调用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这样行只需要设置的DataSource docServer:

docServer.DataSource = templateBindingSource; 

后,只是做邮件合并,并使用您的形式letterWriterEditor显示它:

docServer.MailMerge(letterWriterEditor.Document); 

它应该工作。 :)

相关问题