Click here to Skip to main content
13,052,022 members (64,122 online)
Rate this:
Please Sign up or sign in to vote.
See more:
Dear friends

I have a data gridview and insert around 50 records on it. but when i am printing this gridview useing the fllowing code it is only printing only the the record which are visile in form but there is a scrol on grid view and have more record.

code which i m using :
e.Graphics.DrawImage(Image.FromFile("d:\\logo.bmp"), 10, 50);
            Bitmap bm = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height);
            dataGridView1.DrawToBitmap(bm, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height));
            e.Graphics.DrawImage(bm, 150, 400);

Please help me to print all the record from gridview in C# window form..

thanks in advance..
Posted 17-Oct-12 21:44pm
Updated 17-Oct-12 21:59pm

1 solution

Rate this: bad
Please Sign up or sign in to vote.

Solution 1

follow this link for your problem
DataGridView Printing by Selecting Columns and Rows

or use this class

  class ClsPrint
        #region Variables
        int iCellHeight = 0; //Used to get/set the datagridview cell height
        int iTotalWidth = 0; //
        int iRow = 0;//Used as counter
        bool bFirstPage = false; //Used to check whether we are printing first page
        bool bNewPage = false;// Used to check whether we are printing a new page
        int iHeaderHeight = 0; //Used for the header height
        StringFormat strFormat; //Used to format the grid rows.
        ArrayList arrColumnLefts = new ArrayList();//Used to save left coordinates of columns
        ArrayList arrColumnWidths = new ArrayList();//Used to save column widths
        private PrintDocument _printDocument = new PrintDocument();
        private DataGridViewX gw = new DataGridViewX();
        private string _ReportHeader;
        public ClsPrint(DataGridView gridview, string ReportHeader)
            _printDocument.PrintPage += new PrintPageEventHandler(_printDocument_PrintPage);
            _printDocument.BeginPrint += new PrintEventHandler(_printDocument_BeginPrint);
            gw = gridview;
            _ReportHeader = ReportHeader;
        public void PrintForm()
            ////Open the print dialog
            //PrintDialog printDialog = new PrintDialog();
            //printDialog.Document = _printDocument;
            //printDialog.UseEXDialog = true;
            ////Get the document
            //if (DialogResult.OK == printDialog.ShowDialog())
            //    _printDocument.DocumentName = "Test Page Print";
            //    _printDocument.Print();
            //Open the print preview dialog
            PrintPreviewDialog objPPdialog = new PrintPreviewDialog();
            objPPdialog.Document = _printDocument;
        private void _printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
            //Set the left margin
            int iLeftMargin = e.MarginBounds.Left;
            //Set the top margin
            int iTopMargin = e.MarginBounds.Top;
            //Whether more pages have to print or not
            bool bMorePagesToPrint = false;
            int iTmpWidth = 0;
            //For the first page to print set the cell width and header height
            if (bFirstPage)
                foreach (DataGridViewColumn GridCol in gw.Columns)
                    iTmpWidth = (int)(Math.Floor((double)((double)GridCol.Width /
                        (double)iTotalWidth * (double)iTotalWidth *
                        ((double)e.MarginBounds.Width / (double)iTotalWidth))));
                    iHeaderHeight = (int)(e.Graphics.MeasureString(GridCol.HeaderText,
                        GridCol.InheritedStyle.Font, iTmpWidth).Height) + 11;
                    // Save width and height of headers
                    iLeftMargin += iTmpWidth;
            //Loop till all the grid rows not get printed
            while (iRow <= gw.Rows.Count - 1)
                DataGridViewRow GridRow = gw.Rows[iRow];
                //Set the cell height
                iCellHeight = GridRow.Height + 5;
                int iCount = 0;
                //Check whether the current page settings allows more rows to print
                if (iTopMargin + iCellHeight >= e.MarginBounds.Height + e.MarginBounds.Top)
                    bNewPage = true;
                    bFirstPage = false;
                    bMorePagesToPrint = true;
                    if (bNewPage)
                        //Draw Header
                            new Font(gw.Font, FontStyle.Bold),
                            Brushes.Black, e.MarginBounds.Left,
                            e.MarginBounds.Top - e.Graphics.MeasureString(_ReportHeader,
                            new Font(gw.Font, FontStyle.Bold),
                            e.MarginBounds.Width).Height - 13);
                        String strDate = "";
                        //Draw Date
                            new Font(gw.Font, FontStyle.Bold), Brushes.Black,
                            e.MarginBounds.Left +
                            (e.MarginBounds.Width - e.Graphics.MeasureString(strDate,
                            new Font(gw.Font, FontStyle.Bold),
                            e.MarginBounds.Top - e.Graphics.MeasureString(_ReportHeader,
                            new Font(new Font(gw.Font, FontStyle.Bold),
                            FontStyle.Bold), e.MarginBounds.Width).Height - 13);
                        //Draw Columns                 
                        iTopMargin = e.MarginBounds.Top;
                        DataGridViewColumn[] _GridCol = new DataGridViewColumn[gw.Columns.Count];
                        int colcount = 0;
                        //Convert ltr to rtl
                        foreach (DataGridViewColumn GridCol in gw.Columns)
                            _GridCol[colcount++] = GridCol;
                        for (int i = (_GridCol.Count() - 1); i >= 0; i--)
                            e.Graphics.FillRectangle(new SolidBrush(Color.LightGray),
                                new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                                (int)arrColumnWidths[iCount], iHeaderHeight));
                                new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                                (int)arrColumnWidths[iCount], iHeaderHeight));
                                new SolidBrush(_GridCol[i].InheritedStyle.ForeColor),
                                new RectangleF((int)arrColumnLefts[iCount], iTopMargin,
                                (int)arrColumnWidths[iCount], iHeaderHeight), strFormat);
                        bNewPage = false;
                        iTopMargin += iHeaderHeight;
                    iCount = 0;
                    DataGridViewCell[] _GridCell = new DataGridViewCell[GridRow.Cells.Count];
                    int cellcount = 0;
                    //Convert ltr to rtl
                    foreach (DataGridViewCell Cel in GridRow.Cells)
                        _GridCell[cellcount++] = Cel;
                    //Draw Columns Contents                
                    for (int i = (_GridCell.Count() - 1); i >= 0; i--)
                        if (_GridCell[i].Value != null)
                                new SolidBrush(_GridCell[i].InheritedStyle.ForeColor),
                                new RectangleF((int)arrColumnLefts[iCount],
                                (int)arrColumnWidths[iCount], (float)iCellHeight),
                        //Drawing Cells Borders 
                            new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                            (int)arrColumnWidths[iCount], iCellHeight));
                iTopMargin += iCellHeight;
            //If more lines exist, print another page.
            if (bMorePagesToPrint)
                e.HasMorePages = true;
                e.HasMorePages = false;
            //catch (Exception exc)
            //    MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK,
            //       MessageBoxIcon.Error);
        private void _printDocument_BeginPrint(object sender, System.Drawing.Printing.PrintEventArgs e)
                strFormat = new StringFormat();
                strFormat.Alignment = StringAlignment.Center;
                strFormat.LineAlignment = StringAlignment.Center;
                strFormat.Trimming = StringTrimming.EllipsisCharacter;
                iCellHeight = 0;
                iRow = 0;
                bFirstPage = true;
                bNewPage = true;
                // Calculating Total Widths
                iTotalWidth = 0;
                foreach (DataGridViewColumn dgvGridCol in gw.Columns)
                    iTotalWidth += dgvGridCol.Width;
            catch (Exception ex)
                MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
Member 10700093 23-Oct-15 7:38am
Nice nice :) But how do i make the content of the headers fit nicely on the page?
Atm. all columns are mashed together leaving no room for "a long title".
I have some colms that fit nicely atm, but thins like title of a report, gets truncated and only displays first 20 letters or so. How can i make some sort of autosize option work within this code ?

Thank you very much :)

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)

  Print Answers RSS
Top Experts
Last 24hrsThis month

Advertise | Privacy | Mobile
Web02 | 2.8.170713.1 | Last Updated 18 Oct 2012
Copyright © CodeProject, 1999-2017
All Rights Reserved. Terms of Service
Layout: fixed | fluid

CodeProject, 503-250 Ferrand Drive Toronto Ontario, M3C 3G8 Canada +1 416-849-8900 x 100