Click here to Skip to main content
12,397,575 members (60,487 online)
Rate this:
Please Sign up or sign in to vote.
See more: C#
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.160721.1 | Last Updated 18 Oct 2012
Copyright © CodeProject, 1999-2016
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