Как программно объединить данные в 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);

Он должен работать.:)

Другие вопросы по тегам