CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 4 of 4
  1. #1
    Join Date
    Dec 2002
    Location
    Tenby, Wales
    Posts
    277

    My Brain's gone numb!

    I kow I should know how to do this but can someone show me how to use the following code with a button to print my DataGridView please?
    Code:
    Private oStringFormat As StringFormat
        Private oStringFormatComboBox As StringFormat
        Private oButton As Button
        Private oCheckbox As CheckBox
        Private oComboBox As ComboBox 
        Private nTotalWidth As Int16
        Private nRowPos As Int16
        Private NewPage As Boolean
        Private nPageNo As Int16
        Private Header As String = "Header Test"
        Private sUserName As String = "Will"
    
        Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
    
            oStringFormat = New StringFormat
            oStringFormat.Alignment = StringAlignment.Near
            oStringFormat.LineAlignment = StringAlignment.Center
            oStringFormat.Trimming = StringTrimming.EllipsisCharacter
    
            oStringFormatComboBox = New StringFormat
            oStringFormatComboBox.LineAlignment = StringAlignment.Center
            oStringFormatComboBox.FormatFlags = StringFormatFlags.NoWrap
            oStringFormatComboBox.Trimming = StringTrimming.EllipsisCharacter
    
            oButton = New Button
            oCheckbox = New CheckBox
            oComboBox = New ComboBox
    
            nTotalWidth = 0
            For Each oColumn As DataGridViewColumn In DataGridView1.Columns
    
                nTotalWidth += oColumn.Width
    
            Next
            nPageNo = 1
            NewPage = True
            nRowPos = 0
    
        End Sub
    
        Private Sub PrintDocument1_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    
                Static oColumnLefts As New ArrayList
                Static oColumnWidths As New ArrayList
                Static oColumnTypes As New ArrayList
                Static nHeight As Int16
    
                Dim nWidth, i, nRowsPerPage As Int16
                Dim nTop As Int16 = e.MarginBounds.Top
                Dim nLeft As Int16 = e.MarginBounds.Left
    
                If nPageNo = 1 Then
    
                    For Each oColumn As DataGridViewColumn In DataGridView1.Columns
    
                        nWidth = CType(Math.Floor(oColumn.Width / nTotalWidth * nTotalWidth * (e.MarginBounds.Width / nTotalWidth)), Int16)
    
                        nHeight = e.Graphics.MeasureString(oColumn.HeaderText, oColumn.InheritedStyle.Font, nWidth).Height + 11
    
                        oColumnLefts.Add(nLeft)
                        oColumnWidths.Add(nWidth)
                        oColumnTypes.add(oColumn.GetType)
                        nLeft += nWidth
    
                    Next
    
                End If
    
                Do While nRowPos < DataGridView1.Rows.Count - 1
    
                    Dim oRow As DataGridViewRow = DataGridView1.Rows(nRowPos)
    
                    If nTop + nHeight >= e.MarginBounds.Height + e.MarginBounds.Top Then
    
                        DrawFooter(e, nRowsPerPage)
    
                        NewPage = True
                        nPageNo += 1
                        e.HasMorePages = True
                        Exit Sub
    
                    Else
    
                        If NewPage Then
    
                            ' Draw Header
                            e.Graphics.DrawString(Header, New Font(DataGridView1.Font, FontStyle.Bold), Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top - e.Graphics.MeasureString(Header, New Font(DataGridView1.Font, FontStyle.Bold), e.MarginBounds.Width).Height - 13)
    
                            ' Draw Columns
                            nTop = e.MarginBounds.Top
                            i = 0
                            For Each oColumn As DataGridViewColumn In DataGridView1.Columns
    
                                e.Graphics.FillRectangle(New SolidBrush(Drawing.Color.LightGray), New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                                e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
                                e.Graphics.DrawString(oColumn.HeaderText, oColumn.InheritedStyle.Font, New SolidBrush(oColumn.InheritedStyle.ForeColor), New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat)
                                i += 1
    
                            Next
                            NewPage = False
    
                        End If
    
                        nTop += nHeight
                        i = 0
                        For Each oCell As DataGridViewCell In oRow.Cells
    
                            If oColumnTypes(i) Is GetType(DataGridViewTextBoxColumn) OrElse oColumnTypes(i) Is GetType(DataGridViewLinkColumn) Then
    
                                e.Graphics.DrawString(oCell.Value.ToString, oCell.InheritedStyle.Font, New SolidBrush(oCell.InheritedStyle.ForeColor), New RectangleF(oColumnLefts(i), nTop, oColumnWidths(i), nHeight), oStringFormat)
    
                            ElseIf oColumnTypes(i) Is GetType(DataGridViewButtonColumn) Then
    
                                oButton.Text = oCell.Value.ToString
                                oButton.Size = New Size(oColumnWidths(i), nHeight)
                                Dim oBitmap As New Bitmap(oButton.Width, oButton.Height)
                                oButton.DrawToBitmap(oBitmap, New Rectangle(0, 0, oBitmap.Width, oBitmap.Height))
                                e.Graphics.DrawImage(oBitmap, New Point(oColumnLefts(i), nTop))
    
                            ElseIf oColumnTypes(i) Is GetType(DataGridViewCheckBoxColumn) Then
    
                                oCheckbox.Size = New Size(14, 14)
                                oCheckbox.Checked = CType(oCell.Value, Boolean)
                                Dim oBitmap As New Bitmap(oColumnWidths(i), nHeight)
                                Dim oTempGraphics As Graphics = Graphics.FromImage(oBitmap)
                                oTempGraphics.FillRectangle(Brushes.White, New Rectangle(0, 0, oBitmap.Width, oBitmap.Height))
                                oCheckbox.DrawToBitmap(oBitmap, New Rectangle(CType((oBitmap.Width - oCheckbox.Width) / 2, Int32), CType((oBitmap.Height - oCheckbox.Height) / 2, Int32), oCheckbox.Width, oCheckbox.Height))
                                e.Graphics.DrawImage(oBitmap, New Point(oColumnLefts(i), nTop))
    
                            ElseIf oColumnTypes(i) Is GetType(DataGridViewComboBoxColumn) Then
    
                                oComboBox.Size = New Size(oColumnWidths(i), nHeight)
                                Dim oBitmap As New Bitmap(oComboBox.Width, oComboBox.Height)
                                oComboBox.DrawToBitmap(oBitmap, New Rectangle(0, 0, oBitmap.Width, oBitmap.Height))
                                e.Graphics.DrawImage(oBitmap, New Point(oColumnLefts(i), nTop))
                                e.Graphics.DrawString(oCell.Value.ToString, oCell.InheritedStyle.Font, New SolidBrush(oCell.InheritedStyle.ForeColor), New RectangleF(oColumnLefts(i) + 1, nTop, oColumnWidths(i) - 16, nHeight), oStringFormatComboBox)
    
                            ElseIf oColumnTypes(i) Is GetType(DataGridViewImageColumn) Then
    
                                Dim oCellSize As Rectangle = New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight)
                                Dim oImageSize As Size = CType(oCell.Value, Image).Size
                                e.Graphics.DrawImage(oCell.Value, New Rectangle(oColumnLefts(i) + CType(((oCellSize.Width - oImageSize.Width) / 2), Int32), nTop + CType(((oCellSize.Height - oImageSize.Height) / 2), Int32), CType(oCell.Value, Image).Width, CType(oCell.Value, Image).Height))
    
                            End If
    
                            e.Graphics.DrawRectangle(Pens.Black, New Rectangle(oColumnLefts(i), nTop, oColumnWidths(i), nHeight))
    
                            i += 1
    
                        Next
    
                    End If
    
                    nRowPos += 1
                    nRowsPerPage += 1
    
                Loop
    
                DrawFooter(e, nRowsPerPage)
    
                e.HasMorePages = False
    
        End Sub
    
        Private Sub DrawFooter(ByVal e As System.Drawing.Printing.PrintPageEventArgs, ByVal RowsPerPage As Int32)
    
            Dim sPageNo As String = nPageNo.ToString + " of " + Math.Ceiling(DataGridView1.Rows.Count / RowsPerPage).ToString
    
            ' Right Align - User Name
            e.Graphics.DrawString(sUserName, DataGridView1.Font, Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(sPageNo, DataGridView1.Font, e.MarginBounds.Width).Width), e.MarginBounds.Top + e.MarginBounds.Height + 7)
    
            ' Left Align - Date/Time
            e.Graphics.DrawString(Now.ToLongDateString + " " + Now.ToShortTimeString, DataGridView1.Font, Brushes.Black, e.MarginBounds.Left, e.MarginBounds.Top + e.MarginBounds.Height + 7)
    
            ' Center  - Page No. Info
            e.Graphics.DrawString(sPageNo, DataGridView1.Font, Brushes.Black, e.MarginBounds.Left + (e.MarginBounds.Width - e.Graphics.MeasureString(sPageNo, DataGridView1.Font, e.MarginBounds.Width).Width) / 2, e.MarginBounds.Top + e.MarginBounds.Height + 31)
    
        End SubThanks in advance
    It is from a previous post by Hannes in a thread about printing DataGridViews.

    Thanks in advance
    Visual Basic 2005 ver. 8.0.50727.867

  2. #2
    Join Date
    Dec 2002
    Location
    Tenby, Wales
    Posts
    277

    Re: My Brain's gone numb!

    Forget it - my Brain just switched back on!!
    Last edited by brjames32; February 25th, 2009 at 10:10 AM.
    Visual Basic 2005 ver. 8.0.50727.867

  3. #3
    Join Date
    Mar 2007
    Location
    Argentina
    Posts
    579

    Re: My Brain's gone numb!

    Quote Originally Posted by brjames32 View Post
    Forget it - my Brain just switched back on!!
    before doing it you should check that YourBrain IsNot Nothing, then enclose the procedure on a safe Try...End Try block.
    [Vb.NET 2008 (ex Express)]

  4. #4
    Join Date
    Dec 2002
    Location
    Tenby, Wales
    Posts
    277

    Re: My Brain's gone numb!

    I couldn't agree more!!!
    Visual Basic 2005 ver. 8.0.50727.867

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured