Using Printer to print all the records of DataRepeater

One question being asked about DataRepeater in the MSDN forum is that how to print all the populated records from DataRepeater. If the number of the records is small enough to fit into the view of the DataRepeater, this would be a very simple task: use PrintForm component to print the form that contains the DataRepeater. However, the number of records is usually large and records cannot be fit in one page. To print all the records including the records that are out of view, Printer component (another VB Power Packs component) can be used.

For example, let’s say I have a DataRepeater control and a “Print” button on a Form.

Then I add a “Click” event handler for the Print button. In the Click event handler, I’ll print all the records. The basic idea here is to go through all the DataRepeater items. For each DataRepeater item, set it as the current item of the DataRepeater. This is to make the item scroll into the view. Then I draw the item to a bitmap by using Control.DrawToBitmap. And finally I print the bitmap to the printer.

This is the code:

 

     Private Sub PrintButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles PrintButton.Click
        If Me.DataRepeater1.ItemCount > 0 Then
            ' Define a VB Power Packs Printer object
            Dim printer As New Printer()

            Dim sz As Size = Me.DataRepeater1.CurrentItem.ClientSize
            Dim w As Integer = sz.Width
            Dim h As Integer = sz.Height

            Dim bm As New Bitmap(w, h)

            Dim x = 0
            Dim y = 100

            Dim n As Integer = Me.DataRepeater1.ItemCount
            For i As Integer = 1 To n
                ' Set item i be the current item so that it can be visible
                Me.DataRepeater1.CurrentItemIndex = i - 1

                ' Paint the content of the current DataRepeater item to a bitmap
                Dim item As DataRepeaterItem = Me.DataRepeater1.CurrentItem
                item.DrawToBitmap(bm, item.ClientRectangle)

                ' if y coordinate > height of the page, start a new page
                ' assuming one page can show 15 items
                If y + h * 15 + 100 > printer.ScaleHeight Then
                    printer.NewPage()
                    y = 100
                End If

                ' Print the bitmap to the printer
                printer.PaintPicture(bm, x, y)

                ' Calculate the next left,top position
                y += h * 15
            Next

            printer.EndDoc()
        End If
    End Sub

You may need to import following namespace if you haven’t done so:

 Imports Microsoft.VisualBasic.PowerPacks
Imports Microsoft.VisualBasic.PowerPacks.Printing.Compatibility.VB6
  
 Related topic:  DataRepeater Control for Windows Forms