I want to give application admins to create new templates. Something like
Hello <LastName>, <FirstName>. You owe us <AmountOwed>. Please mail a check to <Address>.
I spend some time research, and it appears that it's doable using RichTextEditor and MailMerge. However, I can't seem to find an ability for the user to actually create a template through a GUI. What am I missing?
8 Answers, 1 is accepted
Looks like my google fu got stronger, and I found exactly what I needed http://docs.telerik.com/devtools/winforms/richtexteditor/features/mail-merge
However, it's spitting out a single document. Is there a way to get it to generate multiple documents without just setting a source to a list with a single item? I feel like there's gotta be a flag that can do this. I'd also prefer to have more control over a process. I want to give the application a folder path, and then using the data source, create multiple documents with unique names.
Well, I managed to figure it out, and it turns out to be quite simple. If there's a better way of doing this, I'd love to hear it, but my code is below.
radRichTextEditor1.Document.MailMergeDataSource.MoveToFirst();using (var folderDialog = new FolderBrowserDialog()){ folderDialog.ShowNewFolderButton = true; if (folderDialog.ShowDialog() == DialogResult.OK) { var provider = new DocxFormatProvider(); do { var item = (Employee) radRichTextEditor1.Document.MailMergeDataSource.CurrentItem; var d = this.radRichTextEditor1.Document.MailMergeCurrentRecord(); using (Stream output = File.Create(folderDialog.SelectedPath + "\\" + item.FirstName + ".docx")) { provider.Export(d, output); } } while (radRichTextEditor1.Document.MailMergeDataSource.MoveToNext()); }}Thank you for writing.
I confirm that the approach you are employing is valid. I can only add that if you need to update the control and its UI while performing the operation you can call the UpdateAllFields method of the editor with a FieldDisplayMode.Result flag or use preview the results as shown here: http://docs.telerik.com/devtools/winforms/richtexteditor/features/mail-merge#previewing-the-results-of-mail-merge.
I hope this helps. Should you have further questions please do not hesitate to write back.
Regards,
Hristo Merdjanov
Telerik by Progress
Thank you. I do have an additonal question. Is there a way to override the "Save" button behavior?
I want to be able to save the document to SQL database, and then be able to load it.
I think I am close. I used the code found in the Remove Controls from Rich Text Editor Ribbon Bar thread and I can get get my custom even to fire. However, the save dialog still comes up. How do I suppress it?
public partial class Letters : RadRibbonForm{ public Letters() { InitializeComponent(); var ribbonUI = new CustomRichTextEditorRibbonBar(); ribbonUI.AssociatedRichTextEditor = radRichTextEditor1; this.Controls.Add(ribbonUI); }}public class CustomRichTextEditorRibbonBar : RichTextEditorRibbonBar{ protected override void Initialize() { base.Initialize(); this.buttonSave.Click += ButtonSave_Click1; } private void ButtonSave_Click1(object sender, EventArgs e) { throw new NotImplementedException(); }}Thank you for writing.
Using the suggested approach is valid, however, as you have already observed this will not prevent executing the built-in logic handling the save operation.
The method responsible for performing the save command is also virtual and you can override it. This way you will not need to create a new event handler and the default behavior will be overridden as well:
public class CustomRichTextEditorRibbonBar : RichTextEditorRibbonBar{ protected override void BackstageButtonSave_Click(object sender, EventArgs e) { if (this.IsDesignMode || this.AssociatedRichTextEditor == null) { return; } //Your custom logic... }}I hope this helps. Please let me know if you need further assistance.
Regards,
Hristo Merdjanov
Telerik by Progress
Thank you, that did it. Well, almost, I needed to override the small save icon in the top right corner, so I just had to use a different method
protected override void ButtonSave_Click(object sender, EventArgs e){ SaveClicked?.Invoke(this, EventArgs.Empty);}Thank you for writing back.
I am glad that you have managed to achieve the desired result.
Please let me know if you need further assistance.
Regards,
Hristo Merdjanov
Telerik by Progress
