DataTplProductIf.cs
//
// This code is part of Document Solutions for Word demos.
// Copyright (c) MESCIUS inc. All rights reserved.
//
using System;
using System.IO;
using System.Drawing;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Linq;
using System.Globalization;
using GrapeCity.Documents.Word;

namespace DsWordWeb.Demos
{
    // This example is similar to DataTplProductList, but additionally
    // the code uses report templates' conditional construct '{{if...}}..{{else}}..{{endif}}'
    // to filter data so that only products with price greater than $50 are included.
    // Note that the filtered data is rendered as a table, each record in a separate table row.
    // If the first column of a table starts with '{{if...}}' and ends with '{{endif}}',
    // empty rows added as the result of template expansion will be removed.
    public class DataTplProductIf
    {
        public GcWordDocument CreateDocx()
        {
            // Load and modify the template DOCX:
            var doc = new GcWordDocument();
            doc.Load(Path.Combine("Resources", "WordDocs", "ProductListTemplate.docx"));
            var caption0 = "Product List";
            var caption1 = $"Products that cost more than $50";
            var pStart0 = @"{{#ds}}{{ds.ProductID}}";
            var pEnd0 = @"{{/ds}}";
            // NOTE: for empty rows to be automatically removed, the first cell in the template row
            // must start with {{if ...}}, and the last cell must end with matching {{endif}}:
            var pStart1 = @"{{if ds.UnitPrice > 50}}{{ds.ProductID}}";
            var pEnd1 = @"{{endif}}";

            doc.Body.Replace(caption0, caption1);
            doc.Body.Replace(pEnd0, pEnd1);
            doc.Body.Replace(pStart0, pStart1);

            using var ds = new DataSet();
            // Load data and build the product list data source:
            ds.ReadXml(Path.Combine("Resources", "data", "DsNWind.xml"));

            DataTable dtProds = ds.Tables["Products"];
            DataTable dtSupps = ds.Tables["Suppliers"];

            var products =
                from prod in dtProds.Select()
                join supp in dtSupps.Select()
                on prod["SupplierID"] equals supp["SupplierID"]
                orderby prod["UnitPrice"] descending
                select new
                {
                    ProductID = prod["ProductID"],
                    ProductName = prod["ProductName"],
                    Supplier = supp["CompanyName"],
                    QuantityPerUnit = prod["QuantityPerUnit"],
                    UnitPrice = prod["UnitPrice"]
                };

            // Add the data source to the data template data sources:
            doc.DataTemplate.DataSources.Add("ds", products);

            // Process the template:
            doc.DataTemplate.Process(CultureInfo.GetCultureInfo("en-US"));
            // Done:
            return doc;
        }
    }
}