Follow up to this thread: IFieldMergingCallback: how to highlight unmerged field
John
Doe<o:p></o:p>
second page (incorrect output):
Mike
Smith<o:p></o:p>
«LastName»
John Doe<o:p></o:p>
second page:
«FirstName» Smith<o:p></o:p>
Mike «LastName»
_documentBuilder.MoveToMergeField(args.FieldName);
class Program
{
static void Main(string[] args)
{
var doc = new Document(@“Template.docx”);
doc.MailMerge.UseNonMergeFields = true;
doc.MailMerge.FieldMergingCallback = new HighLightFieldMergingCallback();
doc.MailMerge.Execute(GetDataSource());
doc.Save(@“Output.docx”, SaveFormat.Docx);
}<span style="color:blue;">static</span> <span style="color:#2b91af;">IMailMergeDataSource</span> GetDataSource() { <span style="color:blue;">var</span> dataDictionary = <span style="color:blue;">new</span> <span style="color:#2b91af;">List</span><<span style="color:#2b91af;">IDictionary</span><<span style="color:blue;">string</span>, <span style="color:blue;">string</span>>> { <span style="color:blue;">new</span> <span style="color:#2b91af;">Dictionary</span><<span style="color:blue;">string</span>, <span style="color:blue;">string</span>> { { <span style="color:#a31515;">"FirstName"</span>, <span style="color:#a31515;">"John"</span> }, { <span style="color:#a31515;">"LastName"</span>, <span style="color:#a31515;">"Doe"</span> } }, <span style="color:blue;">new</span> <span style="color:#2b91af;">Dictionary</span><<span style="color:blue;">string</span>, <span style="color:blue;">string</span>> { { <span style="color:#a31515;">"FirstName"</span>, <span style="color:#a31515;">""</span> }, { <span style="color:#a31515;">"LastName"</span>, <span style="color:#a31515;">"Smith"</span> } }, <span style="color:blue;">new</span> <span style="color:#2b91af;">Dictionary</span><<span style="color:blue;">string</span>, <span style="color:blue;">string</span>> { { <span style="color:#a31515;">"FirstName"</span>, <span style="color:#a31515;">"Mike"</span> }, { <span style="color:#a31515;">"LastName"</span>, <span style="color:#a31515;">""</span> } } }; <span style="color:blue;">return</span> <span style="color:blue;">new</span> <span style="color:#2b91af;">MailMergeDataSource</span>(dataDictionary); }
}
public class HighLightFieldMergingCallback : IFieldMergingCallback
{
private DocumentBuilder _documentBuilder;<span style="color:blue;">public</span> <span style="color:blue;">void</span> FieldMerging(<span style="color:#2b91af;">FieldMergingArgs</span> args) { <span style="color:blue;">if</span> (_documentBuilder == <span style="color:blue;">null</span>) _documentBuilder = <span style="color:blue;">new</span> <span style="color:#2b91af;">DocumentBuilder</span>(args.Document); <span style="color:blue;">if</span> (!<span style="color:blue;">string</span>.IsNullOrWhiteSpace(args.FieldValue <span style="color:blue;">as</span> <span style="color:blue;">string</span>)) { _documentBuilder.MoveToMergeField(args.FieldName); _documentBuilder.Font.HighlightColor = <span style="color:#2b91af;">Color</span>.Yellow; _documentBuilder.Write(args.FieldValue.ToString()); args.Text = <span style="color:blue;">string</span>.Empty; } <span style="color:blue;">else</span> { <span style="color:blue;">var</span> fieldCode = args.Field.GetFieldCode().Trim(); _documentBuilder.MoveToMergeField(args.FieldName); _documentBuilder.Font.HighlightColor = <span style="color:#2b91af;">Color</span>.Salmon; _documentBuilder.InsertField(fieldCode); } } <span style="color:blue;">public</span> <span style="color:blue;">void</span> ImageFieldMerging(<span style="color:#2b91af;">ImageFieldMergingArgs</span> args) { }
}
public class MailMergeDataSource : IMailMergeDataSource
{
private readonly List<IDictionary<string, string>> _dataSources;
private int _index;<span style="color:blue;">public</span> MailMergeDataSource(<span style="color:#2b91af;">IEnumerable</span><<span style="color:#2b91af;">IDictionary</span><<span style="color:blue;">string</span>, <span style="color:blue;">string</span>>> dataSources) { _dataSources = dataSources.ToList(); _index = -1; } <span style="color:blue;">public</span> <span style="color:blue;">bool</span> MoveNext() { _index++; <span style="color:blue;">return</span> _index < _dataSources.Count; } <span style="color:blue;">public</span> <span style="color:blue;">bool</span> GetValue(<span style="color:blue;">string</span> fieldName, <span style="color:blue;">out</span> <span style="color:blue;">object</span> fieldValue) { <span style="color:blue;">var</span> currentRecord = _dataSources[_index]; <span style="color:blue;">try</span> { fieldValue = currentRecord[fieldName]; <span style="color:blue;">return</span> fieldValue != <span style="color:blue;">null</span>; } <span style="color:blue;">catch</span> (<span style="color:#2b91af;">KeyNotFoundException</span>) { fieldValue = <span style="color:blue;">null</span>; <span style="color:blue;">return</span> <span style="color:blue;">false</span>; } } <span style="color:blue;">public</span> <span style="color:#2b91af;">IMailMergeDataSource</span> GetChildDataSource(<span style="color:blue;">string</span> tableName) { <span style="color:blue;">return</span> <span style="color:blue;">null</span>; } <span style="color:blue;">public</span> <span style="color:blue;">string</span> TableName => <span style="color:blue;">null</span>;
}