Click here to Skip to main content
15,889,116 members
Please Sign up or sign in to vote.
5.00/5 (2 votes)
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 :
C#
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
Updated 17-Oct-12 21:59pm
v2

1 solution

follow this link for your problem
Printing-a-datagridview-in-C-NET-2-0
DataGridView Printing by Selecting Columns and Rows

or use this class

C#
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;

      #endregion

      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;
          objPPdialog.ShowDialog();
      }

      private void _printDocument_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
      {
          //try
          //{
          //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
                  arrColumnLefts.Add(iLeftMargin);
                  arrColumnWidths.Add(iTmpWidth);
                  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;
                  break;
              }
              else
              {

                  if (bNewPage)
                  {
                      //Draw Header
                      e.Graphics.DrawString(_ReportHeader,
                          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
                      e.Graphics.DrawString(strDate,
                          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.Width).Width),
                          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));

                          e.Graphics.DrawRectangle(Pens.Black,
                              new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                              (int)arrColumnWidths[iCount], iHeaderHeight));

                          e.Graphics.DrawString(_GridCol[i].HeaderText,
                              _GridCol[i].InheritedStyle.Font,
                              new SolidBrush(_GridCol[i].InheritedStyle.ForeColor),
                              new RectangleF((int)arrColumnLefts[iCount], iTopMargin,
                              (int)arrColumnWidths[iCount], iHeaderHeight), strFormat);
                          iCount++;
                      }
                      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)
                      {
                          e.Graphics.DrawString(_GridCell[i].FormattedValue.ToString(),
                              _GridCell[i].InheritedStyle.Font,
                              new SolidBrush(_GridCell[i].InheritedStyle.ForeColor),
                              new RectangleF((int)arrColumnLefts[iCount],
                              (float)iTopMargin,
                              (int)arrColumnWidths[iCount], (float)iCellHeight),
                              strFormat);
                      }
                      //Drawing Cells Borders
                      e.Graphics.DrawRectangle(Pens.Black,
                          new Rectangle((int)arrColumnLefts[iCount], iTopMargin,
                          (int)arrColumnWidths[iCount], iCellHeight));
                      iCount++;
                  }
              }
              iRow++;
              iTopMargin += iCellHeight;
          }
          //If more lines exist, print another page.
          if (bMorePagesToPrint)
              e.HasMorePages = true;
          else
              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)
      {
          try
          {
              strFormat = new StringFormat();
              strFormat.Alignment = StringAlignment.Center;
              strFormat.LineAlignment = StringAlignment.Center;
              strFormat.Trimming = StringTrimming.EllipsisCharacter;

              arrColumnLefts.Clear();
              arrColumnWidths.Clear();
              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);
          }
      }

  }
 
Share this answer
 
v2
Comments
XenosDK 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)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900