Quantcast
Channel: VBForums - Visual Basic .NET
Viewing all articles
Browse latest Browse all 27384

[RESOLVED] Datagridview Print not formatting decimal values

$
0
0
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

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

This is the code I found to print 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

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
Attached Images
 

Viewing all articles
Browse latest Browse all 27384


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>