Been working on printing datagridview and found a solution that works for what I need except for one thing. The decimal formatting is not maintained properly.
The datagridview's data source is an in memory datatable.
I found code and modified it only enough to point to my datagridview1. This works great with regard that it fits the data nicely on the page and handles multiple pages. Somehow though, I'm loosing the default cell formatting that is applied to the dgv when the print preview action takes place.
This is my dgv formatting code in Form Load
This is the code I found to print with
Picture of what's happening to the decimal formatting. Columns 4 - 9 are not maintaining the decimal places that I set for the dgv in my form load code. How do i fix this?
![Name: New Picture (87).jpg
Views: 64
Size: 17.2 KB]()
The datagridview's data source is an in memory datatable.
I found code and modified it only enough to point to my datagridview1. This works great with regard that it fits the data nicely on the page and handles multiple pages. Somehow though, I'm loosing the default cell formatting that is applied to the dgv when the print preview action takes place.
This is my dgv formatting code in Form Load
Code:
With DataGridView1
Me.DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.None
Me.DataGridView1.Columns.Item(0).MinimumWidth = 5
Me.DataGridView1.Columns.Item(0).Width = 50
Me.DataGridView1.Columns.Item(1).MinimumWidth = 5
Me.DataGridView1.Columns.Item(1).Width = 50
Me.DataGridView1.Columns.Item(2).MinimumWidth = 5
Me.DataGridView1.Columns.Item(2).Width = 50
Me.DataGridView1.Columns.Item(3).MinimumWidth = 5
Me.DataGridView1.Columns.Item(3).Width = 50
Me.DataGridView1.Columns.Item(4).MinimumWidth = 5
Me.DataGridView1.Columns.Item(4).Width = 60
Me.DataGridView1.Columns.Item(5).MinimumWidth = 5
Me.DataGridView1.Columns.Item(5).Width = 75
Me.DataGridView1.Columns.Item(6).MinimumWidth = 5
Me.DataGridView1.Columns.Item(6).Width = 65
Me.DataGridView1.Columns.Item(7).MinimumWidth = 5
Me.DataGridView1.Columns.Item(7).Width = 65
Me.DataGridView1.Columns.Item(8).MinimumWidth = 5
Me.DataGridView1.Columns.Item(8).Width = 65
Me.DataGridView1.Columns.Item(9).MinimumWidth = 5
Me.DataGridView1.Columns.Item(9).Width = 75
Me.DataGridView1.Columns.Item(10).MinimumWidth = 5
Me.DataGridView1.Columns.Item(10).Width = 50
Me.DataGridView1.Columns.Item(11).MinimumWidth = 5
Me.DataGridView1.Columns.Item(11).Width = 50
Me.DataGridView1.Columns.Item(4).DefaultCellStyle.Format = "n1" ' Valve CFM Per Square Inch
Me.DataGridView1.Columns.Item(5).DefaultCellStyle.Format = "n3" ' Valve Coefficient Column
Me.DataGridView1.Columns.Item(6).DefaultCellStyle.Format = "n3" ' Effective Flow Area Column
Me.DataGridView1.Columns.Item(7).DefaultCellStyle.Format = "n3" ' Actual Flow Area Column
Me.DataGridView1.Columns.Item(8).DefaultCellStyle.Format = "n1" ' Calculated Throat Velocity
Me.DataGridView1.Columns.Item(9).DefaultCellStyle.Format = "n1" ' Average Port Velocity In Feet Per Second
Me.DataGridView1.Columns(0).ValueType = GetType(Double)
Me.DataGridView1.AllowUserToResizeColumns = True
Me.DataGridView1.AllowUserToOrderColumns = False
Me.DataGridView1.MultiSelect = True
End With
Code:
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim x As Integer = 100
Dim y As Integer = 25
Dim header As Boolean = True
'draw headers
Dim j As Integer = 0
Do While (j < Me.DataGridView1.Columns.Count)
Dim rect As Rectangle = New Rectangle(x, y, Me.DataGridView1.Columns(j).Width, Me.DataGridView1.ColumnHeadersHeight)
Dim sf As StringFormat = New StringFormat
sf.LineAlignment = StringAlignment.Center
sf.Alignment = StringAlignment.Center
e.Graphics.FillRectangle(Brushes.LightGray, rect)
e.Graphics.DrawRectangle(Pens.Black, rect)
If (Not (Me.DataGridView1.Columns(j).HeaderText) Is Nothing) Then
e.Graphics.DrawString(Me.DataGridView1.Columns(j).HeaderText, SystemFonts.DefaultFont, Brushes.Black, rect, sf)
End If
x = (x + rect.Width)
j = (j + 1)
Loop
x = 100
y = (y + Me.DataGridView1.ColumnHeadersHeight)
'draw rows
For Me.whRow = whRow To Me.DataGridView1.RowCount - 1
Dim drow As DataGridViewRow = Me.DataGridView1.Rows(whRow)
j = 0
Do While (j < Me.DataGridView1.Columns.Count)
Dim cell As DataGridViewCell
cell = drow.Cells(j)
Dim rect As Rectangle = New Rectangle(x, y, cell.Size.Width, cell.Size.Height)
Dim sf As StringFormat = New StringFormat
sf.LineAlignment = StringAlignment.Center
sf.Alignment = StringAlignment.Center
e.Graphics.DrawRectangle(Pens.Black, rect)
If (Not (cell.Value) Is Nothing) Then
e.Graphics.DrawString(cell.Value.ToString, SystemFonts.DefaultFont, Brushes.Black, rect, sf)
End If
x = (x + rect.Width)
j = (j + 1)
Loop
x = 100
y = (y + drow.Height)
'----------------------New page----------------------------
If (y > e.MarginBounds.Bottom) Then 'Print new page
e.HasMorePages = True
y = 20
Exit Sub
End If
'-----------------------------------------------------------------
Next
End Sub