Monday, March 18, 2013

How to Create Report (RDLC) in WPF


Introduction

This article shows how to add a RDLC report in WPF.

Step 1

Create a WPF project

Step 2

Add a class in the project  named "Invoice.cs".

public class Invoice
{
        public String Sno { get; set; }
        public int OrderNumber { get; set; }
        public DateTime OrderDate { get; set; }
        public String CustomerName { get; set; }
        public String Address { get; set; }
        public Boolean Warranty { get; set; }
}

Step 3

Add an .rdlc file named "InvoiceReport.rdlc".






Now click on the "OK" button and a DataSet will be added for the InvoiceReport.rdlc report.


Step 4

Add a User Control in the "User Control" folder in the project named "ReportViewer.xaml"



This reportViewer user control will contain the RDLC report.

Now add two DLLs as references.


The first one is Microsoft.ReportViewer.WinForms.
The second one is WindowsFormsIntegration.


Now add the following line in your "ReportViewer.xaml":

xmlns:rv="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"

and

 <WindowsFormsHost>
       <rv:ReportViewer x:Name="reportViewer" />
 </WindowsFormsHost>


Now the file will look like:

********************************************************

<UserControl x:Class="ListViewTutorial.ReportViewer"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:rv="clr-namespace:Microsoft.Reporting.WinForms;assembly=Microsoft.ReportViewer.WinForms"
             Loaded="UserControl_Loaded">
    <Grid HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <WindowsFormsHost>
            <rv:ReportViewer x:Name="reportViewer" />
        </WindowsFormsHost>
    </Grid>
</UserControl>

********************************************************

On the UserControl_Loaded event write the following code.

We can bind the report with the database table from the SQL Server database but now I have generated a DataTable at run time with the same fields details Invoice.cs

********************************************************

using System;
using System.Data;
using System.Windows;
using System.Windows.Controls;
using Microsoft.Reporting.WinForms;

namespace ListViewTutorial
{
    /// <summary>
    /// Interaction logic for UserControl1.xaml
    /// </summary>
    public partial class ReportViewer : UserControl
    {
        public ReportViewer()
        {
            InitializeComponent();
        }

        private void UserControl_Loaded(object sender, RoutedEventArgs e)
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("Sno", typeof(String)));
            dt.Columns.Add(new DataColumn("OrderNumber", typeof(int)));
            dt.Columns.Add(new DataColumn("OrderDate", typeof(DateTime)));
            dt.Columns.Add(new DataColumn("CustomerName", typeof(String)));
            dt.Columns.Add(new DataColumn("Address", typeof(String)));
            dt.Columns.Add(new DataColumn("Warranty", typeof(Boolean)));

            try
            {
                Random randNum = new Random();

                String[] states = { "Delhi", "UP", "MP", "Ap", "Panjap" };
                String[] names = { "Kaushik", "Amit", "Geeta", "Naveen", "Priyank", "Rahul", "Sumit", "Pushp", "Rohit", "Ravi", "Anand", "Suresh", "Rakesh", "Ajay", "Prabhat" };
                Boolean[] boolVals = { false, true, false, true, false, true, true, false };

                Invoice[] invoice = new Invoice[101];
                for (int index = 1; index < invoice.Length; index++)
                {

                    DataRow dr = dt.NewRow();
                    dr["Sno"] = index.ToString();
                    dr["OrderNumber"] = randNum.Next(1, 1000);
                    dr["OrderDate"] = DateTime.Now.AddDays(randNum.Next(1, 30));
                    dr["CustomerName"] = names[randNum.Next(0, 14)].ToString();
                    dr["Address"] = String.Format("House Number  {0}, {1} ", randNum.Next(1, 1000), states[randNum.Next(0, states.Length - 1)].ToString());
                    dr["Warranty"] = boolVals[randNum.Next(0, boolVals.Length - 1)];
                    dt.Rows.Add(dr);
                }

                ReportDataSource reportDataSource = new ReportDataSource();
                reportDataSource.Name = "InvoiceDataSet"; // Name of the DataSet we set in .rdlc
                reportDataSource.Value = dt;
                reportViewer.LocalReport.ReportPath = "D:\\My Projects\\ListViewTutorial\\ListViewTutorial\\InvoiceReport.rdlc"; // Path of the rdlc file

                reportViewer.LocalReport.DataSources.Add(reportDataSource);
                reportViewer.RefreshReport();
            }
            catch (Exception)
            {
                throw;
            }
        }
    }
}

********************************************************

Step 5

Now the last step.


Open the MainWindow.xaml

Write the following XAML for this XAML file:


<Window x:Class="ListViewTutorial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" 
        Height="600" 
        Width="814"
        xmlns:report="clr-namespace:ListViewTutorial">
    <Grid>

        <report:ReportViewer ></report:ReportViewer>

    </Grid>
</Window>

Now Build the project and run it.


Generate custom report in wpf


<Window x:Class="ListViewTutorial.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:ListViewTutorial"
        Title="MainWindow"
        Height="380" 
        Width="650" 
        WindowStartupLocation="CenterScreen"
        ResizeMode="NoResize"
        Loaded="Window_Loaded">

    <Grid>
        
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="Auto"/>
        </Grid.ColumnDefinitions>
        
        <ListView Grid.Row="0" Grid.Column="0"
                  Name="LstSalesData" 
                  ScrollViewer.VerticalScrollBarVisibility="Auto" 
                  ScrollViewer.HorizontalScrollBarVisibility="Disabled"
                  SelectionMode="Multiple"
                  Height="300" 
                  VerticalAlignment="Top">
            
            <ListView.View>
                <GridView>
                    <GridViewColumn Header="SNO." DisplayMemberBinding="{Binding Sno}" Width="50"/>
                    <GridViewColumn Header="Order Number" DisplayMemberBinding="{Binding OrderNumber}" Width="70"/>
                    <GridViewColumn Header="Order Date" DisplayMemberBinding="{Binding OrderDate,StringFormat=MMM dd yyyy}" Width="100"/>
                    <GridViewColumn Header="Customer Name" DisplayMemberBinding="{Binding CustomerName}" Width="100"/>
                    <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Address}" Width="190"/>
                    <GridViewColumn Header="Warranty" DisplayMemberBinding="{Binding Warranty}" Width="100"/>
                </GridView>
            </ListView.View>
        </ListView>

        <Button Grid.Row="1" Grid.Column="0" 
                Name="btnPrint" 
                HorizontalAlignment="Right"
                Content="Print" 
                Click="Print_Click" 
                Width="100" 
                Margin="0,5,10,0"
                Height="25"/>
    </Grid>
</Window>

***************************************************************

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Media;

namespace ListViewTutorial
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {

        private List<SalesData> lstSalesData =null;
        private static readonly object locker = new object();

        /// <summary>
        /// Initializes a new instance of the <see cref="MainWindow" /> class.
        /// </summary>
        public MainWindow()
        {
            InitializeComponent();
            this.lstSalesData = new List<SalesData>();
        }

        /// <summary>
        /// Handles the Loaded event of the Window control.
        /// </summary>
        /// <param name="sender">The source of the event.</param>
        /// <param name="e">The <see cref="System.Windows.RoutedEventArgs" /> instance containing the event data.</param>
        private void Window_Loaded(object sender, RoutedEventArgs e)
        {
            this.LstSalesData.ItemsSource = GetSalesData();
        }

        /// <summary>
        /// Gets the sales data.
        /// </summary>
        /// <returns></returns>
        private List<SalesData> GetSalesData()
        {
            try
            {
                Random randNum = new Random();

                String[] states={"Delhi","UP","MP","Ap","Panjap"};
                String[] names = { "Kaushik","Amit","Geeta","Naveen","Priyank","Rahul","Sumit","Pushp","Rohit","Ravi","Anand","Suresh","Rakesh","Ajay","Prabhat"};
                Boolean[] boolVals = { false, true, false, true, false, true, true, false };

                SalesData[] salesdata = new SalesData[101];
                for (int index = 1; index < salesdata.Length; index++)
                {
                    salesdata[index] = new SalesData();
                    salesdata[index].Sno = index.ToString();
                    salesdata[index].Address = String.Format("House Number  {0}, {1} ", randNum.Next(1, 1000), states[randNum.Next(0, states.Length - 1)].ToString());
                    salesdata[index].CustomerName = names[randNum.Next(0, 14)].ToString();
                    salesdata[index].OrderDate = DateTime.Now.AddDays(randNum.Next(1, 30));
                    salesdata[index].OrderNumber = randNum.Next(1, 1000);
                    salesdata[index].Warranty = boolVals[randNum.Next(0, boolVals.Length - 1)];
                    this.lstSalesData.Add(salesdata[index]);
                }
            }
            catch (Exception)
            { 
                throw;
            }
            return this.lstSalesData;
        }

        private void Print_Click(object sender, RoutedEventArgs e)
        {
            try
            {

                PrintDialog printDialog = new PrintDialog();

                if (printDialog.ShowDialog() == false)
                    return;

                Size pageSize = new Size(printDialog.PrintableAreaWidth, printDialog.PrintableAreaHeight);

                GridDocumentPaginator paginator = new GridDocumentPaginator("123-06470", this.lstSalesData, pageSize, new Thickness(10, 10, 10, 10));
                printDialog.PrintDocument(paginator, "Sales Info");
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
            }
        }
    }

    /// <summary>
    /// Interaction logic for SalesData.
    /// </summary>
    internal class SalesData
    {
        public SalesData()
        { 
        
        }
        public String Sno { get; set; }
        public int OrderNumber { get; set; }
        public DateTime OrderDate { get; set; }
        public String CustomerName { get; set; }
        public String Address { get; set; }
        public Boolean Warranty { get; set; }
    }

    /// <summary>
    ///  This class contains interaction logic that supports creation of multiple-page elements from a single document.
    /// </summary>
    internal class GridDocumentPaginator : DocumentPaginator
    {
        #region Private Members

        private Double _avgRowHeight;

        private Double _availableHeight;

        private List<SalesData> _gridContentData = new List<SalesData>();

        private String _tinNumber = String.Empty;

        private int _rowsPerPage;

        private int _pageCount;

        private int _skipRows = 0;

        #endregion

        #region Constructor

        public GridDocumentPaginator(String tinNumber, List<SalesData> gridContentData, Size pageSize, Thickness pageMargin)
        {
            this.PageSize = pageSize;
            this.PageMargin = pageMargin;
            this._gridContentData = gridContentData;
            this._tinNumber = tinNumber;
            this._skipRows = 0;

            if (_gridContentData != null)
                MeasureElements();
        }

        #endregion

        #region Public Properties

        public Thickness PageMargin { get; set; }

        public override Size PageSize { get; set; }

        public override bool IsPageCountValid
        {
            get { return true; }
        }

        /// <summary>
        /// When overridden in a derived class, gets a count of the number of pages currently
        /// formatted
        /// A count of the number of pages that have been formatted.
        /// </summary>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        public override int PageCount
        {
            get { return _pageCount; }
        }

        /// <summary>
        /// When overridden in a derived class, returns the element being paginated.
        /// Returns:
        /// An System.Windows.Documents.IDocumentPaginatorSource representing the element
        /// being paginated.
        /// </summary>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        public override IDocumentPaginatorSource Source
        {
            get { return null; }
        }

        #endregion

        #region Public Methods

        /// <summary>
        /// When overridden in a derived class, gets the System.Windows.Documents.DocumentPage
        /// for the specified page number.
        /// Parameters:
        /// pageNumber:
        /// The zero-based page number of the document page that is needed.
        /// Returns:
        /// The System.Windows.Documents.DocumentPage for the specified pageNumber, or
        /// System.Windows.Documents.DocumentPage.Missing if the page does not exist.
        /// Exceptions:
        /// System.ArgumentOutOfRangeException:
        /// pageNumber is negative.
        /// </summary>
        /// <param name="pageNumber"></param>
        /// <returns></returns>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        public override DocumentPage GetPage(int pageNumber)
        {
            return ConstructPage(ContentGrid(), pageNumber);
        }

        #endregion

        #region Private Methods

        /// <summary>
        /// This function measures the heights of the page header, page footer and grid header and the first row in the grid
        /// in order to work out how manage pages might be required.
        /// </summary>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        private void MeasureElements()
        {
            double allocatedSpace = 0;

            //Measure the page header
            ContentControl pageHeader = new ContentControl();
            pageHeader.Content = CreateDocumentHeader();
            allocatedSpace = MeasureHeight(pageHeader);

            //Measure the page footer
            ContentControl pageFooter = new ContentControl();
            pageFooter.Content = CreateDocumentFooter(0);
            allocatedSpace += MeasureHeight(pageFooter);

            //Include any margins
            allocatedSpace += this.PageMargin.Bottom + this.PageMargin.Top;

            //Work out how much space we need to display the grid
            _availableHeight = this.PageSize.Height - allocatedSpace;

            //Calculate the height of the first row
            _avgRowHeight = 30D;

            //Calculate how many rows we can fit on each page
            double rowsPerPage = Math.Floor(_availableHeight / _avgRowHeight);

            if (!double.IsInfinity(rowsPerPage))
                _rowsPerPage = Convert.ToInt32(rowsPerPage);

            //Count the rows in the document source
            double rowCount = _gridContentData.Count;

            //Calculate the nuber of pages that we will need
            if (rowCount > 0)
                _pageCount = Convert.ToInt32(Math.Ceiling(rowCount / rowsPerPage));
        }

        /// <summary>
        /// This method constructs the document page (visual) to print
        /// </summary>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        private DocumentPage ConstructPage(Grid content, int pageNumber)
        {
            if (content == null)
                return null;

            //Build the page inc header and footer
            Grid pageGrid = new Grid();

            //Header row
            AddGridRow(pageGrid, GridLength.Auto);

            //Content row
            AddGridRow(pageGrid, new GridLength(1.0d, GridUnitType.Star));

            //Footer row
            AddGridRow(pageGrid, GridLength.Auto);

            ContentControl pageHeader = new ContentControl();
            pageHeader.Content = this.CreateDocumentHeader();
            pageGrid.Children.Add(pageHeader);

            if (content != null)
            {
                content.SetValue(Grid.RowProperty, 1);
                pageGrid.Children.Add(content);
            }

            ContentControl pageFooter = new ContentControl();
            pageFooter.Content = CreateDocumentFooter(pageNumber + 1);
            pageFooter.SetValue(Grid.RowProperty, 2);

            pageGrid.Children.Add(pageFooter);

            double width = this.PageSize.Width - (this.PageMargin.Left + this.PageMargin.Right);
            double height = this.PageSize.Height - (this.PageMargin.Top + this.PageMargin.Bottom);

            pageGrid.Measure(new Size(width, height));
            pageGrid.Arrange(new Rect(this.PageMargin.Left, this.PageMargin.Top, width, height));

            return new DocumentPage(pageGrid);
        }

        /// <summary>
        /// Measures the height of an element
        /// </summary>
        /// <param name="element"></param>
        /// <returns></returns>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        private double MeasureHeight(FrameworkElement element)
        {
            if (element == null)
                throw new ArgumentNullException("element");

            element.Measure(this.PageSize);
            return element.DesiredSize.Height;
        }

        /// <summary>
        /// Adds a row to a grid
        /// </summary>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        private void AddGridRow(Grid grid, GridLength rowHeight)
        {
            if (grid == null)
                return;

            RowDefinition rowDef = new RowDefinition();

            if (rowHeight != null)
                rowDef.Height = rowHeight;

            grid.RowDefinitions.Add(rowDef);
        }

        /// <summary>
        /// Header of Grid.
        /// </summary>
        /// <returns></returns>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        private Grid CreateDocumentHeader()
        {
            Grid gridHeader = new Grid();
            try
            {
                gridHeader.HorizontalAlignment = HorizontalAlignment.Stretch;
                gridHeader.VerticalAlignment = VerticalAlignment.Top;
                gridHeader.Margin = new Thickness(0D);
                gridHeader.ShowGridLines = false;

                for (int i = 0; i < 2; i++)
                {
                    RowDefinition rowdef = new RowDefinition();
                    rowdef.Height = GridLength.Auto;
                    gridHeader.RowDefinitions.Add(rowdef); 
                }

                for (int i = 0; i < 2; i++)                             //Adding two columns in header grid.
                {
                    ColumnDefinition coldef = new ColumnDefinition();
                    coldef.Width = new GridLength(1.0D, GridUnitType.Star);
                    gridHeader.ColumnDefinitions.Add(coldef);
                }

                TextBlock txtBlockR0 = new TextBlock();
                txtBlockR0.Text = "CASH/RETIAL/TAX INVOICE";
                txtBlockR0.FontSize = 18;
                txtBlockR0.FontWeight = FontWeights.Bold;
                txtBlockR0.Height = 45D;
                txtBlockR0.Padding = new Thickness(0, 0, 0, 0);
                txtBlockR0.VerticalAlignment = VerticalAlignment.Top;
                txtBlockR0.HorizontalAlignment = HorizontalAlignment.Center;
                txtBlockR0.TextAlignment = TextAlignment.Center;
                Grid.SetRow(txtBlockR0, 0);
                Grid.SetColumn(txtBlockR0, 0);
                Grid.SetColumnSpan(txtBlockR0, 2);
                gridHeader.Children.Add(txtBlockR0);

                TextBlock txtBlockR1 = new TextBlock();
                txtBlockR1.Text = String.Format("Shop:\t{0}\nAddress:\t{1}\nPH No.:\t{2}", "Software Kaffee", "B-1/54, Sector-18, D.D Complex, Opp. Savitri Market, Noida", "120-4322460");
                txtBlockR1.FontSize = 12;
                txtBlockR1.Height = 80D;
                txtBlockR1.Padding = new Thickness(10, 0, 0, 0);
                txtBlockR1.VerticalAlignment = VerticalAlignment.Top;
                txtBlockR1.HorizontalAlignment = HorizontalAlignment.Left;
                txtBlockR1.TextAlignment = TextAlignment.Left;
                Grid.SetRow(txtBlockR1, 1);
                Grid.SetColumn(txtBlockR1, 0);
                gridHeader.Children.Add(txtBlockR1);
            }
            catch (Exception)
            {
                throw;
            }
            return gridHeader;
        }

        /// <summary>
        /// Footer of Grid.
        /// </summary>
        /// <param name="currentPageCount"></param>
        /// <returns></returns>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        private Grid CreateDocumentFooter(int currentPageCount)
        {
            Grid gridFooter = new Grid();
            try
            {
                gridFooter.HorizontalAlignment = HorizontalAlignment.Center;
                gridFooter.VerticalAlignment = VerticalAlignment.Top;
                gridFooter.Margin = new Thickness(0);
                gridFooter.ShowGridLines = false;

                RowDefinition rowdef = new RowDefinition();
                rowdef.Height = GridLength.Auto;
                gridFooter.RowDefinitions.Add(rowdef);

                ColumnDefinition coldef = new ColumnDefinition();
                coldef.Width = GridLength.Auto;
                gridFooter.ColumnDefinitions.Add(coldef);

                TextBlock footerTextBlock = new TextBlock();
                footerTextBlock.Text = String.Format("Page {0}-{1}", currentPageCount++, _pageCount);
                footerTextBlock.FontSize = 12;
                footerTextBlock.VerticalAlignment = VerticalAlignment.Bottom;
                footerTextBlock.HorizontalAlignment = HorizontalAlignment.Center;
                Grid.SetRow(footerTextBlock, 0);
                Grid.SetColumn(footerTextBlock, 0);
                Grid.SetColumnSpan(footerTextBlock, 2);
                gridFooter.Children.Add(footerTextBlock);
            }
            catch (Exception)
            {
                throw;
            }
            return gridFooter;
        }

        /// <summary>
        /// Content of Grid.
        /// </summary>
        /// <returns></returns>
        /// <Developer>Kaushik Kumar Mistry</Developer>
        /// <DateCreated>08 Nov 2012</DateCreated>
        /// <ModifiedBy>...</ModifiedBy>
        /// <ModifiedDate>...</ModifiedDate>
        private Grid ContentGrid()
        {
            Grid gridContent = new Grid();
            try
            {
                int pageSize = 26;

                var data = _gridContentData.Skip(_skipRows).Take(pageSize);

                int totalRows = data.Count();

                gridContent.HorizontalAlignment = HorizontalAlignment.Stretch;
                gridContent.VerticalAlignment = VerticalAlignment.Top;
                gridContent.Margin = new Thickness(0D);
                gridContent.ShowGridLines = false;

                for (int i = 0; i < totalRows + 2; i++)
                {
                    RowDefinition rowdef = new RowDefinition();
                    rowdef.Height = new GridLength(30D, GridUnitType.Pixel);
                    gridContent.RowDefinitions.Add(rowdef);
                }

                for (int i = 0; i < 6; i++)
                {
                    ColumnDefinition coldef = new ColumnDefinition();
                    coldef.Width = new GridLength(100D, GridUnitType.Star);
                    gridContent.ColumnDefinitions.Add(coldef);
                }

                #region << Grid Border  >>

                for (int i = 1; i < totalRows + 2; i++)
                {
                    for (int j = 0; j < 6; j++)
                    {
                        Border border = new Border();
                        border.BorderThickness = new Thickness(0.3D);
                        if (i == 1)
                        {
                            border.Background = Brushes.Cornsilk;
                        }
                        border.BorderBrush = Brushes.Black;
                        border.SetValue(Grid.ZIndexProperty, -1);
                        Grid.SetRow(border, i);
                        Grid.SetColumn(border, j);
                        gridContent.Children.Add(border);
                    }
                }

                #endregion

                #region <<  Report Title  >>

                TextBlock txtBlockTitle = new TextBlock();
                txtBlockTitle.Text = String.Format("Invoice Information for {0}", this._tinNumber);
                txtBlockTitle.FontSize = 15;
                txtBlockTitle.FontWeight = FontWeights.Bold;
                txtBlockTitle.VerticalAlignment = VerticalAlignment.Center;
                txtBlockTitle.HorizontalAlignment = HorizontalAlignment.Center;
                Grid.SetRow(txtBlockTitle, 0);
                Grid.SetColumn(txtBlockTitle, 0);
                Grid.SetColumnSpan(txtBlockTitle, 6);
                gridContent.Children.Add(txtBlockTitle);

                #endregion

                #region <<  Grid Header  >>

                TextBlock txtBlockHeader = null;

                txtBlockHeader = new TextBlock();
                txtBlockHeader.Text = "SNo #";
                txtBlockHeader.FontSize = 13;
                txtBlockHeader.FontWeight = FontWeights.Bold;
                txtBlockHeader.Padding = new Thickness(10, 0, 0, 0);
                txtBlockHeader.VerticalAlignment = VerticalAlignment.Center;
                txtBlockHeader.HorizontalAlignment = HorizontalAlignment.Left;
                Grid.SetRow(txtBlockHeader, 1);
                Grid.SetColumn(txtBlockHeader, 0);
                gridContent.Children.Add(txtBlockHeader);

                txtBlockHeader = new TextBlock();
                txtBlockHeader.Text = "Order Number";
                txtBlockHeader.FontSize = 13;
                txtBlockHeader.FontWeight = FontWeights.Bold;
                txtBlockHeader.Padding = new Thickness(10, 0, 0, 0);
                txtBlockHeader.VerticalAlignment = VerticalAlignment.Center;
                txtBlockHeader.HorizontalAlignment = HorizontalAlignment.Left;
                Grid.SetRow(txtBlockHeader, 1);
                Grid.SetColumn(txtBlockHeader, 1);
                gridContent.Children.Add(txtBlockHeader);

                txtBlockHeader = new TextBlock();
                txtBlockHeader.Text = "Order Date";
                txtBlockHeader.FontSize = 13;
                txtBlockHeader.FontWeight = FontWeights.Bold;
                txtBlockHeader.Padding = new Thickness(0, 0, 10, 0);
                txtBlockHeader.VerticalAlignment = VerticalAlignment.Center;
                txtBlockHeader.HorizontalAlignment = HorizontalAlignment.Right;
                Grid.SetRow(txtBlockHeader, 1);
                Grid.SetColumn(txtBlockHeader, 2);
                gridContent.Children.Add(txtBlockHeader);

                txtBlockHeader = new TextBlock();
                txtBlockHeader.Text = "Customer Number";
                txtBlockHeader.FontSize = 13;
                txtBlockHeader.FontWeight = FontWeights.Bold;
                txtBlockHeader.Padding = new Thickness(0, 0, 0, 0);
                txtBlockHeader.VerticalAlignment = VerticalAlignment.Center;
                txtBlockHeader.HorizontalAlignment = HorizontalAlignment.Center;
                Grid.SetRow(txtBlockHeader, 1);
                Grid.SetColumn(txtBlockHeader, 3);
                gridContent.Children.Add(txtBlockHeader);

                txtBlockHeader = new TextBlock();
                txtBlockHeader.Text = "Customer Address";
                txtBlockHeader.FontSize = 13;
                txtBlockHeader.FontWeight = FontWeights.Bold;
                txtBlockHeader.Padding = new Thickness(0, 0, 0, 0);
                txtBlockHeader.VerticalAlignment = VerticalAlignment.Center;
                txtBlockHeader.HorizontalAlignment = HorizontalAlignment.Center;
                Grid.SetRow(txtBlockHeader, 1);
                Grid.SetColumn(txtBlockHeader, 4);
                gridContent.Children.Add(txtBlockHeader);

                txtBlockHeader = new TextBlock();
                txtBlockHeader.Text = "Warranty";
                txtBlockHeader.FontSize = 13;
                txtBlockHeader.FontWeight = FontWeights.Bold;
                txtBlockHeader.Padding = new Thickness(10, 0, 0, 0);
                txtBlockHeader.VerticalAlignment = VerticalAlignment.Center;
                txtBlockHeader.HorizontalAlignment = HorizontalAlignment.Left;
                Grid.SetRow(txtBlockHeader, 1);
                Grid.SetColumn(txtBlockHeader, 5);
                gridContent.Children.Add(txtBlockHeader);

                #endregion

                #region <<  Grid Content  >>

                int rowCount = 2;

                foreach (var item in data)
                {
                    TextBlock txtBlock = null;

                    if (item == null)
                    {
                        for (int i = 0; i < 6; i++)
                        {
                            txtBlock = new TextBlock();
                            txtBlock.Text = String.Empty;
                            Grid.SetRow(txtBlock, rowCount);
                            Grid.SetColumn(txtBlock, 0);
                            gridContent.Children.Add(txtBlock);
                        }
                        rowCount++;
                        continue;
                    }

                    #region <<  Column Sno.  >>

                    txtBlock = new TextBlock();
                    txtBlock.Text = item.Sno;
                    txtBlock.FontSize = 12;
                    txtBlock.Padding = new Thickness(10, 0, 0, 0);
                    txtBlock.VerticalAlignment = VerticalAlignment.Top;
                    txtBlock.HorizontalAlignment = HorizontalAlignment.Left;
                    Grid.SetRow(txtBlock, rowCount);
                    Grid.SetColumn(txtBlock, 0);
                    gridContent.Children.Add(txtBlock);

                    #endregion

                    #region <<  Column Order Number.  >>

                    txtBlock = new TextBlock();
                    txtBlock.Text = Convert.ToString(item.OrderNumber);
                    txtBlock.FontSize = 12;
                    txtBlock.Padding = new Thickness(10, 0, 0, 0);
                    txtBlock.VerticalAlignment = VerticalAlignment.Top;
                    txtBlock.HorizontalAlignment = HorizontalAlignment.Left;
                    Grid.SetRow(txtBlock, rowCount);
                    Grid.SetColumn(txtBlock, 1);
                    gridContent.Children.Add(txtBlock);

                    #endregion

                    #region <<  Column Orde rDate.  >>

                    txtBlock = new TextBlock();
                    txtBlock.Text = item.OrderDate==DateTime.MinValue?String.Empty:item.OrderDate.ToShortDateString(); 
                    txtBlock.FontSize = 12;
                    txtBlock.Padding = new Thickness(0, 0, 10, 0);
                    txtBlock.VerticalAlignment = VerticalAlignment.Top;
                    txtBlock.HorizontalAlignment = HorizontalAlignment.Right;
                    Grid.SetRow(txtBlock, rowCount);
                    Grid.SetColumn(txtBlock, 2);
                    gridContent.Children.Add(txtBlock);

                    #endregion

                    #region <<  Column Customer Name.  >>

                    txtBlock = new TextBlock();
                    txtBlock.Text = item.CustomerName;
                    txtBlock.FontSize = 12;
                    txtBlock.Padding = new Thickness(0, 0, 0, 0);
                    txtBlock.VerticalAlignment = VerticalAlignment.Top;
                    txtBlock.HorizontalAlignment = HorizontalAlignment.Center;
                    Grid.SetRow(txtBlock, rowCount);
                    Grid.SetColumn(txtBlock, 3);
                    gridContent.Children.Add(txtBlock);

                    #endregion

                    #region <<  Column Address.  >>

                    txtBlock = new TextBlock();
                    txtBlock.Text = item.Address;
                    txtBlock.FontSize = 12;
                    txtBlock.Padding = new Thickness(0, 0, 0, 0);
                    txtBlock.VerticalAlignment = VerticalAlignment.Top;
                    txtBlock.HorizontalAlignment = HorizontalAlignment.Center;
                    Grid.SetRow(txtBlock, rowCount);
                    Grid.SetColumn(txtBlock, 4);
                    gridContent.Children.Add(txtBlock);

                    #endregion

                    #region <<  Column Warranty.  >>

                    txtBlock = new TextBlock();
                    txtBlock.Text = item.Warranty==true?"Y":"N";
                    txtBlock.FontSize = 12;
                    txtBlock.Padding = new Thickness(10, 0, 0, 0);
                    txtBlock.VerticalAlignment = VerticalAlignment.Top;
                    txtBlock.HorizontalAlignment = HorizontalAlignment.Left;
                    Grid.SetRow(txtBlock, rowCount);
                    Grid.SetColumn(txtBlock, 5);
                    gridContent.Children.Add(txtBlock);

                    #endregion

                    rowCount++;
                }
                _skipRows += pageSize;

                #endregion
            }
            catch (Exception)
            {
                throw;
            }
            return gridContent;
        }

        #endregion
    }
}

***************************************************************