I am trying to get the Print
Preview
of this database that shown on DataGridView
like
the image below:
But, when I clicked the Print
Preview
when the database has been shown on DataGridView
,
I got this following error (shown by image):
The error was pointed on:
catch (Exception exc) // The error pointed on this line { MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); }
in printDocument1_PrintPage()
method
below:
private void printDocument1_PrintPage(object sender, 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; int width = 500; int height = 90; //For the first page to print set the cell width and header height if (bFirstPage) { foreach (DataGridViewColumn GridCol in dataGridView1.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 headres arrColumnLefts.Add(iLeftMargin); arrColumnWidths.Add(iTmpWidth); iLeftMargin += iTmpWidth; } } //Loop till all the grid rows not get printed while (iRow <= dataGridView1.Rows.Count - 1) { DataGridViewRow GridRow = dataGridView1.Rows[iRow]; //Set the cell height iCellHeight = GridRow.Height + 5; int iCount = 0; //Check whether the current page settings allo 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("Student Payment Summary", new Font(dataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString("Student Payment Summary", new Font(dataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13); String strDate = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString(); //Draw Date e.Graphics.DrawString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), e.MarginBounds.Width).Width), e.MarginBounds.Top - e.Graphics.MeasureString("Student Payment Summary", new Font(new Font(dataGridView1.Font, FontStyle.Regular), FontStyle.Regular), e.MarginBounds.Width).Height - 13); //Draw Image e.Graphics.DrawImage(pictureBox1.Image, new Rectangle(300, 0, width, height)); //Draw Columns iTopMargin = e.MarginBounds.Top; foreach (DataGridViewColumn GridCol in dataGridView1.Columns) { e.Graphics.FillRectangle(new SolidBrush(Color.Aqua), 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.HeaderText, GridCol.InheritedStyle.Font, new SolidBrush(GridCol.InheritedStyle.ForeColor), new RectangleF((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iHeaderHeight), strFormat); iCount++; } bNewPage = false; iTopMargin += iHeaderHeight; } iCount = 0; //Draw Columns Contents foreach (DataGridViewCell Cel in GridRow.Cells) { if (Cel.Value != null) { e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, new SolidBrush(Cel.InheritedStyle.ForeColor = System.Drawing.Color.Blue), new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin, (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat); //Drawing Cells Borders e.Graphics.DrawRectangle(Pens.Red, 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) // The error pointed on this line { MessageBox.Show(exc.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } }
Here is the code for all of the necessary printing file:
private void PrintPreview(object sender, EventArgs e) { PrintPreviewDialog _PrintPreview = new PrintPreviewDialog(); printDocument1.DefaultPageSettings.Landscape = true; _PrintPreview.Document = printDocument1; ((Form)_PrintPreview).WindowState = FormWindowState.Maximized; _PrintPreview.ShowDialog(); } private void PrintFile(object sender, EventArgs e) { PrintDialog printDialog = new PrintDialog(); printDocument1.DefaultPageSettings.Landscape = true; printDialog.Document = printDocument1; printDialog.UseEXDialog = true; if (DialogResult.OK == printDialog.ShowDialog()) { printDocument1.DocumentName = "Document Page Print"; printDocument1.Print(); } } private void printDocument1_BeginPrint(object sender, 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; iTotalWidth = 0; foreach (DataGridViewColumn dgvGridCol in dataGridView1.Columns) { iTotalWidth += dgvGridCol.Width; } } catch (Exception ex) { MessageBox.Show(ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); } } private void printDocument1_PrintPage(object sender, 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; int width = 500; int height = 90; //For the first page to print set the cell width and header height if (bFirstPage) { foreach (DataGridViewColumn GridCol in dataGridView1.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 headres arrColumnLefts.Add(iLeftMargin); arrColumnWidths.Add(iTmpWidth); iLeftMargin += iTmpWidth; } } //Loop till all the grid rows not get printed while (iRow <= dataGridView1.Rows.Count - 1) { DataGridViewRow GridRow = dataGridView1.Rows[iRow]; //Set the cell height iCellHeight = GridRow.Height + 5; int iCount = 0; //Check whether the current page settings allo 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("Student Payment Summary", new Font(dataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString("Student Payment Summary", new Font(dataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13); String strDate = DateTime.Now.ToLongDateString() + " " + DateTime.Now.ToShortTimeString(); //Draw Date e.Graphics.DrawString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(strDate, new Font(dataGridView1.Font, FontStyle.Regular), e.MarginBounds.Width).Width), e.MarginBounds.Top - e.Graphics.MeasureString("Student Payment Summary", new Font(new Font(dataGridView1.Font, FontStyle.Regular), FontStyle.Regular), e.MarginBounds.Width).Height - 13); //Draw Image e.Graphics.DrawImage(pictureBox1.Image, new Rectangle(300, 0, width, height)); //Draw Columns iTopMargin = e.MarginBounds.Top; foreach (DataGridViewColumn GridCol in dataGridView1.Columns) { e.Graphics.FillRectangle(new SolidBrush(Color.Aqua), 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.HeaderText, GridCol.InheritedStyle.Font, new SolidBrush(GridCol.InheritedStyle.ForeColor), new RectangleF((int)arrColumnLefts[iCount], iTopMargin, (int)arrColumnWidths[iCount], iHeaderHeight), strFormat); iCount++; } bNewPage = false; iTopMargin += iHeaderHeight; } iCount = 0; //Draw Columns Contents foreach (DataGridViewCell Cel in GridRow.Cells) { if (Cel.Value != null) { e.Graphics.DrawString(Cel.Value.ToString(), Cel.InheritedStyle.Font, new SolidBrush(Cel.InheritedStyle.ForeColor = System.Drawing.Color.Blue), new RectangleF((int)arrColumnLefts[iCount], (float)iTopMargin, (int)arrColumnWidths[iCount], (float)iCellHeight), strFormat); //Drawing Cells Borders e.Graphics.DrawRectangle(Pens.Red, 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 printPreviewToolStripMenuItem_Click(object sender, EventArgs e) { PrintPreview(sender, e); } private void printToolStripMenuItem_Click(object sender, EventArgs e) { PrintFile(sender, e); }
And this image is on the Designer.cs
:
Update:
Stack Trace (Call Stack):
My thought: Is the problem comes because on those `DataGridView` columns, there are a Check Boxes, and those Check Boxes cannot be displayed by printing the file, it is just to show only in the System. Is it true?
Any help will be much appreciated!
Thank you very much!