Grid Printing : Print « GUI Windows Form « C# / C Sharp






Grid Printing

Grid Printing
/*
Professional Windows GUI Programming Using C#
by Jay Glynn, Csaba Torok, Richard Conway, Wahid Choudhury, 
   Zach Greenvoss, Shripad Kulkarni, Neil Whitlow

Publisher: Peer Information
ISBN: 1861007663
*/
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;

using System.Data.SqlClient;
using System.Drawing.Printing;

namespace GridPrinting
{
    /// <summary>
    /// Summary description for Form1.
    /// </summary>
    public class GridPrintingDemo : System.Windows.Forms.Form
    {
        //Stored Page Settings object
        private PageSettings oPageSettings;

        private System.Windows.Forms.MenuItem menuItem1;
        private System.Windows.Forms.MenuItem menuItem2;
        private System.ComponentModel.Container components = null;
        private System.Windows.Forms.MainMenu mnuMain;
        private System.Windows.Forms.PrintPreviewDialog ppDialog;
        private System.Windows.Forms.MenuItem menuItem3;
        private System.Windows.Forms.MenuItem menuItem4;
        private System.Windows.Forms.PrintDialog oPrintDialog;
        private System.Windows.Forms.MenuItem menuItem5;
        private System.Windows.Forms.MenuItem menuItem6;
        private System.Windows.Forms.PageSetupDialog oPageSetup;
        private System.Windows.Forms.DataGrid dGrid;

        public GridPrintingDemo()
        {
            //
            // Required for Windows Form Designer support
            //
            InitializeComponent();

            oPageSettings = new PageSettings();
        }

        /// <summary>
        /// Clean up any resources being used.
        /// </summary>
        protected override void Dispose( bool disposing )
        {
            if( disposing )
            {
                if (components != null) 
                {
                    components.Dispose();
                }
            }
            base.Dispose( disposing );
        }

        #region Windows Form Designer generated code
        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>
        private void InitializeComponent()
        {
//          System.Resources.ResourceManager resources = new System.Resources.ResourceManager(typeof(GridPrintingDemo));
            this.dGrid = new System.Windows.Forms.DataGrid();
            this.mnuMain = new System.Windows.Forms.MainMenu();
            this.menuItem1 = new System.Windows.Forms.MenuItem();
            this.menuItem3 = new System.Windows.Forms.MenuItem();
            this.menuItem4 = new System.Windows.Forms.MenuItem();
            this.menuItem2 = new System.Windows.Forms.MenuItem();
            this.menuItem5 = new System.Windows.Forms.MenuItem();
            this.menuItem6 = new System.Windows.Forms.MenuItem();
            this.ppDialog = new System.Windows.Forms.PrintPreviewDialog();
            this.oPrintDialog = new System.Windows.Forms.PrintDialog();
            this.oPageSetup = new System.Windows.Forms.PageSetupDialog();
            ((System.ComponentModel.ISupportInitialize)(this.dGrid)).BeginInit();
            this.SuspendLayout();
            // 
            // dGrid
            // 
            this.dGrid.DataMember = "";
            this.dGrid.Dock = System.Windows.Forms.DockStyle.Fill;
            this.dGrid.HeaderForeColor = System.Drawing.SystemColors.ControlText;
            this.dGrid.Name = "dGrid";
            this.dGrid.Size = new System.Drawing.Size(292, 266);
            this.dGrid.TabIndex = 0;
            // 
            // mnuMain
            // 
            this.mnuMain.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                    this.menuItem1});
            // 
            // menuItem1
            // 
            this.menuItem1.Index = 0;
            this.menuItem1.MenuItems.AddRange(new System.Windows.Forms.MenuItem[] {
                                                                                      this.menuItem3,
                                                                                      this.menuItem4,
                                                                                      this.menuItem2,
                                                                                      this.menuItem5,
                                                                                      this.menuItem6});
            this.menuItem1.Text = "&File";
            // 
            // menuItem3
            // 
            this.menuItem3.Index = 0;
            this.menuItem3.Text = "Page Setup...";
            this.menuItem3.Click += new System.EventHandler(this.menuItem3_Click);
            // 
            // menuItem4
            // 
            this.menuItem4.Index = 1;
            this.menuItem4.Text = "Print...";
            this.menuItem4.Click += new System.EventHandler(this.menuItem4_Click);
            // 
            // menuItem2
            // 
            this.menuItem2.Index = 2;
            this.menuItem2.Text = "Print Preview...";
            this.menuItem2.Click += new System.EventHandler(this.menuItem2_Click);
            // 
            // menuItem5
            // 
            this.menuItem5.Index = 3;
            this.menuItem5.Text = "-";
            // 
            // menuItem6
            // 
            this.menuItem6.Index = 4;
            this.menuItem6.Text = "Exit";
            // 
            // ppDialog
            // 
            this.ppDialog.AutoScrollMargin = new System.Drawing.Size(0, 0);
            this.ppDialog.AutoScrollMinSize = new System.Drawing.Size(0, 0);
            this.ppDialog.ClientSize = new System.Drawing.Size(400, 300);
            this.ppDialog.Enabled = true;
//          this.ppDialog.Icon = ((System.Drawing.Icon)(resources.GetObject("ppDialog.Icon")));
            this.ppDialog.Location = new System.Drawing.Point(121, 21);
            this.ppDialog.MaximumSize = new System.Drawing.Size(0, 0);
            this.ppDialog.Name = "ppDialog";
            this.ppDialog.Opacity = 1;
            this.ppDialog.TransparencyKey = System.Drawing.Color.Empty;
            this.ppDialog.Visible = false;
            // 
            // oPrintDialog
            // 
            this.oPrintDialog.AllowSomePages = true;
            // 
            // GridPrintingDemo
            // 
            this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
            this.ClientSize = new System.Drawing.Size(292, 266);
            this.Controls.AddRange(new System.Windows.Forms.Control[] {
                                                                          this.dGrid});
            this.Menu = this.mnuMain;
            this.Name = "GridPrintingDemo";
            this.Text = "Printing Grid Example";
            this.Load += new System.EventHandler(this.Form1_Load);
            ((System.ComponentModel.ISupportInitialize)(this.dGrid)).EndInit();
            this.ResumeLayout(false);

        }
        #endregion

        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main() 
        {
            Application.Run(new GridPrintingDemo());
        }

        private void Form1_Load(object sender, System.EventArgs e)
        {
            try
            {
                //COnnection to database - get dataset
                SqlConnection aConn = new SqlConnection("data source=HOBBIT;initial catalog=Northwind;integrated security=SSPI;");
                SqlDataAdapter sqlAdapter = new SqlDataAdapter("Select CompanyName, Address, City, Region, PostalCode, Country from Customers",aConn);
                DataSet aDataSet = new DataSet();
                sqlAdapter.Fill(aDataSet);

                //Assign dataset to Grid
                dGrid.DataSource = aDataSet;
                dGrid.SetDataBinding(aDataSet.Tables[0],"");    
            }
            catch(Exception ex)
            {
                MessageBox.Show(ex.ToString(),"Error");
            }
        }

        private void menuItem2_Click(object sender, System.EventArgs e)
        {
            //Setup the document to print
            PrintGridDocument aDoc = new PrintGridDocument(dGrid);
            aDoc.Title = "Employee Report";
            oPrintDialog.Document = aDoc;
            if (oPrintDialog.ShowDialog() == DialogResult.OK)
            {
                //Display the print preview dialog
                aDoc.DefaultPageSettings = oPageSettings;
                ppDialog.Document = aDoc;
                ppDialog.ShowDialog();
            }
        }

        private void menuItem3_Click(object sender, System.EventArgs e)
        {
            oPageSetup.PageSettings = oPageSettings;
            if(oPageSetup.ShowDialog() == DialogResult.OK)
            {
                oPageSettings = oPageSetup.PageSettings;
            }
        }

        private void menuItem4_Click(object sender, System.EventArgs e)
        {
            //Setup the document to print
            PrintGridDocument aDoc = new PrintGridDocument(dGrid);
            aDoc.Title = "Employee Report";
            oPrintDialog.Document = aDoc;
            if (oPrintDialog.ShowDialog() == DialogResult.OK)
            {
                //Display the print preview dialog
                aDoc.DefaultPageSettings = oPageSettings;
                try
                {
                    //Print the document
                    aDoc.Print();
                }
                catch(Exception ex)
                {
                    //Display any errors
                    MessageBox.Show(ex.ToString());
                }
            }
        }
    }

    public class PrintGridDocument : PrintDocument
    {
        //Data Members
        private DataGrid m_oDataGrid;
        private int m_nCurrPage;
        private int m_nCurrRow;
        private int m_nColumns;
        private int m_nRows;
        private bool m_bInitialized;
        private int m_nLinesPerPage;
        private int m_nTotalPages;
        private int[] m_nColBounds;

        //Properties
        public Font PrintFont;
        public string Title;

        public PrintGridDocument(DataGrid aGrid) : base()
        {
            //Default Values
            m_oDataGrid = aGrid;
            m_nCurrPage = 0;
            m_nCurrRow = 0;
            m_bInitialized = false;

            //Get total number of cols/rows in the data source
            m_nColumns = ((DataTable)(m_oDataGrid.DataSource)).Columns.Count;
            m_nRows = ((DataTable)(m_oDataGrid.DataSource)).Rows.Count;
        }

        //Override OnBeginPrint to set up the font we are going to use
        protected override void OnBeginPrint(PrintEventArgs ev) 
        {
            base.OnBeginPrint(ev);
            //If client has not created a font, create a default font
            // Note: an exception could be raised here, but it is deliberately not
            // being caught because there is nothing we could do at this point!
            if(PrintFont == null)
                PrintFont = new Font("Arial", 9);

        }

        //Override the OnPrintPage to provide the printing logic for the document
        protected override void OnPrintPage(PrintPageEventArgs e) 
        {
            //Call base method
            base.OnPrintPage(e);

            //Get the margins 
            int nTextPosX = e.MarginBounds.Left;
            int nTextPosY = e.MarginBounds.Top;

            //Do first time initialization stuff
            if(!m_bInitialized)
            {
                // Calculate the number of lines per page.
                m_nLinesPerPage = (int)(e.MarginBounds.Height  / PrintFont.GetHeight(e.Graphics));
                m_nTotalPages = (int)Math.Ceiling((float)m_nRows / (float)m_nLinesPerPage);
            
                //Create bounding box for columns
                m_nColBounds = new int[m_nColumns];

                //Calculate the correct spacing for the columns
                for(int nCol = 0;nCol<m_nColumns;nCol++)
                {
                    //Measure the column headers first
                    m_nColBounds[nCol] = (int)e.Graphics.MeasureString(
                        ((DataTable)(m_oDataGrid.DataSource)).Columns[nCol].ColumnName, PrintFont).Width;
                
                    for(int nRow=0;nRow<m_nRows;nRow++)
                    {
                        //Compare data to current max
                        if(e.Graphics.MeasureString(m_oDataGrid[nRow,nCol].ToString(),PrintFont).Width > m_nColBounds[nCol])
                            m_nColBounds[nCol] = (int)e.Graphics.MeasureString(m_oDataGrid[nRow,nCol].ToString(),PrintFont).Width;
                    }
                    
                    //Just use max possible size if too large
                    if(m_nColBounds[nCol] > e.MarginBounds.Width / m_nColumns)
                        m_nColBounds[nCol] = e.MarginBounds.Width / m_nColumns;
                    
                    //Can't be less than column width
                    if(m_nColBounds[nCol] < (int)Math.Round(e.Graphics.MeasureString(((DataTable)(m_oDataGrid.DataSource)).Columns[nCol].ColumnName, PrintFont).Width))
                        m_nColBounds[nCol] = (int)Math.Round(e.Graphics.MeasureString(((DataTable)(m_oDataGrid.DataSource)).Columns[nCol].ColumnName, PrintFont).Width);
                }

                //Move to correct starting page
                if(this.PrinterSettings.PrintRange == PrintRange.SomePages)
                {
                    while(m_nCurrPage < this.PrinterSettings.FromPage-1)
                    {
                        //Move to next page - advance data to next page as well
                        m_nCurrRow += m_nLinesPerPage;
                        m_nCurrPage++;
                        if(m_nCurrRow > m_nRows)
                            return;
                    }

                    if(m_nCurrPage > this.PrinterSettings.ToPage)
                    {
                        //Don't print anything more
                        return;
                    }
                }

                //Set flag
                m_bInitialized = true;
            }

            //Move to next page
            m_nCurrPage++;

            //Print Title if first page
            if(m_nCurrPage == 1)
            {
                Font TitleFont = new Font("Arial",15);
                int nXPos = (int)(((e.PageBounds.Right - e.PageBounds.Left) /2 ) - 
                    (e.Graphics.MeasureString(Title,TitleFont).Width / 2));
                e.Graphics.DrawString(Title,TitleFont,Brushes.Black,nXPos,e.MarginBounds.Top - TitleFont.GetHeight(e.Graphics) - 10);
            }

            //Draw page number
            string strOutput = "Page " + m_nCurrPage + " of " + m_nTotalPages;
            e.Graphics.DrawString(strOutput,PrintFont,Brushes.Black,e.MarginBounds.Right - e.Graphics.MeasureString(strOutput,PrintFont).Width,
                e.MarginBounds.Bottom);

            //Utility rectangle - use for many drawing operations
            Rectangle aRect = new Rectangle();

            //Loop through data
            for(int nRow=m_nCurrRow; nRow < m_nRows; nRow++)
            {
                //Draw the current row within a shaded/unshaded box
                aRect.X = e.MarginBounds.Left;
                aRect.Y = nTextPosY;
                aRect.Width = e.MarginBounds.Width;
                aRect.Height = (int)PrintFont.GetHeight(e.Graphics);
                
                //Draw the box
                if(nRow%2 == 0)
                    e.Graphics.FillRectangle(Brushes.LightGray,aRect);

                e.Graphics.DrawRectangle(Pens.Black,aRect);

                //Loop through each column
                for(int nCol=0; nCol < m_nColumns; nCol++)
                {
                    //Set the rectangle to the correct position
                    aRect.X = nTextPosX;
                    aRect.Y = nTextPosY;
                    aRect.Width = m_nColBounds[nCol];
                    aRect.Height = (int)PrintFont.GetHeight(e.Graphics);
                    //Print the data
                    e.Graphics.DrawString(m_oDataGrid[nRow,nCol].ToString(),PrintFont,Brushes.Black,aRect);
                    //Advance the x Position counter
                    nTextPosX += m_nColBounds[nCol];
                }
                
                //Reassign the x position counter
                nTextPosX = e.MarginBounds.Left;
                //Move the y position counter down a line
                nTextPosY += (int)PrintFont.GetHeight(e.Graphics);
                
                //Check to see if we have reached the line limit - move to a new page if so
                if(nRow - ((m_nCurrPage-1) * m_nLinesPerPage) == m_nLinesPerPage)
                {
                    //Save the current row
                    m_nCurrRow = ++nRow;
                    e.HasMorePages = true;
                    return;
                }
            }
        }
    }


}


           
       








Related examples in the same category

1.Control PrintControl Print
2.Simple Report PrinterSimple Report Printer
3.Begin Print
4.Define Print SettingsDefine Print Settings
5.Print Dialogs
6.Print EventsPrint Events
7.UI PrintUI Print
8.Basic Printing
9.Printer Caps 1
10.Printer Caps 2Printer Caps 2
11.Printer Caps 3Printer Caps 3
12.Printer Caps 4Printer Caps 4
13.Printer Caps 5Printer Caps 5
14.Printer Caps 6Printer Caps 6