Как программно объединить данные в DevExpress RichEditControl?
Я хочу разрешить пользователям выбирать из списка предопределенных шаблонов. Когда шаблон выбран, RichEditControl (REC) отображает документ, отформатированный в соответствии с выбранным шаблоном, с уже объединенными полями. (Пользователь никогда не видит двойную скобку "код позади" документа слияния.) Мои шаблоны находятся в базе данных как varbinary и передаются в графический интерфейс пользователя как байтовые массивы в классе, который в разобранном виде выглядит следующим образом:
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, это то, что должно происходить.
Если у кого-нибудь есть идеи, буду благодарен. Заранее спасибо.
1 ответ
В настоящее время я делаю нечто подобное, в моем случае я загружаю шаблон внутри RichEditDocumentServer (который похож на RichEditControl, но без пользовательского интерфейса), затем устанавливаю DataSource объекта MailMerge, после этого просто вызываю метод MailMerge RichEditDocumentServer и выдаю документ 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;
после этого просто сделайте MailMerge и отобразите его, используя вашу форму letterWriterEditor:
docServer.MailMerge(letterWriterEditor.Document);
Он должен работать.:)