/// <summary> /// Render a foreach page element /// </summary> /// <param name="forEach"></param> /// <param name="document"></param> /// <param name="wdDoc"></param> /// <param name="context"></param> /// <param name="mainDocumentPart"></param> /// <param name="formatProvider"></param> public static void Render(this ForEachPage forEach, Document document, OpenXmlElement wdDoc, ContextModel context, MainDocumentPart mainDocumentPart, IFormatProvider formatProvider) { context.ReplaceItem(forEach, formatProvider); if (string.IsNullOrEmpty(forEach.DataSourceKey) || !context.ExistItem <DataSourceModel>(forEach.DataSourceKey)) { return; } var datasource = context.GetItem <DataSourceModel>(forEach.DataSourceKey); if (datasource == null || datasource.Items == null) { return; } int i = 0; foreach (var item in datasource.Items) { var newPage = forEach.Clone(); // doc inherit margin from page if (document.Margin == null && newPage.Margin != null) { document.Margin = newPage.Margin; } // newPage inherit margin from doc else if (document.Margin != null && newPage.Margin == null) { newPage.Margin = document.Margin; } if (!string.IsNullOrWhiteSpace(forEach.AutoContextAddItemsPrefix)) { // We add automatic keys : // Is first item item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsFirstItem#", new BooleanModel(i == 0)); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsNotFirstItem#", new BooleanModel(i > 0)); // Is last item item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsLastItem#", new BooleanModel(i == datasource.Items.Count - 1)); // Index of the element (Based on 0, and based on 1) item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IndexBaseZero#", new StringModel(i.ToString())); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IndexBaseOne#", new StringModel((i + 1).ToString())); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsOdd#", new BooleanModel(i % 2 == 1)); item.AddItem("#" + forEach.AutoContextAddItemsPrefix + "_ForEachPage_IsEven#", new BooleanModel(i % 2 == 0)); } newPage.Clone().Render(document, wdDoc, item, mainDocumentPart, formatProvider); i++; } }