Как программно объединить данные в 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, это должно происходить.

Если у кого есть идеи, буду признателен. Заранее спасибо.


person RobC    schedule 30.06.2012    source источник
comment
@Kuffs Код, который я использую, приведен выше - второй блок кода в моем вопросе. Я ожидаю увидеть результат слияния моего шаблона (предоставленного Template.Document) с данными, предоставленными классом LetterWriterMergeFieldCollection.   -  person RobC    schedule 02.07.2012


Ответы (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);

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

person echavez    schedule 10.09.2012