Click here to Skip to main content
15,889,876 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
hope you all fine, Im working on .net app for my small business , i want to print report for the delegate, I already done code to print list view but what i want is print the form with labels and the list view like this :
JavaScript
what i want to print


but my code give me this :
JavaScript
what i have now


and in the list view how can i make the list view right to left in the print preview.
thanks.

this is my code :

VB
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim PrintPreview As New PrintPreviewDialog
    PrintPreview.Document = PrintDocument1
    PrintPreview.ShowDialog()
End Sub
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
    'Keep track of the Line Y postition to determine if there are more pages
    Static CurrentYPosition As Integer = 0
    'The below is desined for details view.
    If ListView1.View = View.Details Then
        PrintDetails(e)
    End If
End Sub
Private Sub PrintDetails(ByRef e As System.Drawing.Printing.PrintPageEventArgs)
    Static LastIndex As Integer = 0
    Static CurrentPage As Integer = 0
    'Getting the current dpi so the textleftpad 
    'will be the same on a different dpi than 
    'the 96 i'm using.  Won't make much of a difference though.
    Dim DpiGraphics As Graphics = Me.CreateGraphics
    Dim DpiX As Integer = DpiGraphics.DpiX
    Dim DpiY As Integer = DpiGraphics.DpiY
    DpiGraphics.Dispose()
    Dim X, Y As Integer
    Dim ImageWidth As Integer
    Dim TextRect As Rectangle = Rectangle.Empty
    Dim TextLeftPad As Single = CSng(-4 * (DpiX / 96)) '4 pixel pad on the left.
    Dim ColumnHeaderHeight As Single = CSng(ListView1.Font.Height + (10 * (DpiX / 96))) '5 pixel pad on the top an bottom
    Dim StringFormat As New StringFormat
    Dim PageNumberWidth As Single = e.Graphics.MeasureString(CStr(CurrentPage), ListView1.Font).Width
    'Specify the text should be drawn in the center of the line and
    'that the text should not be wrapped and the text should show
    'ellipsis would cut off.

    StringFormat.FormatFlags = StringFormatFlags.NoWrap
    StringFormat.Trimming = StringTrimming.EllipsisCharacter
    StringFormat.LineAlignment = StringAlignment.Center
    CurrentPage += 1
    'Start the x and  y at the top left margin.
    X = CInt(e.MarginBounds.X)
    Y = CInt(e.MarginBounds.Y)
    'Draw the column headers
    For ColumnIndex As Integer = 0 To ListView1.Columns.Count - 1
        TextRect.X = X
        TextRect.Y = Y
        TextRect.Width = ListView1.Columns(ColumnIndex).Width
        TextRect.Height = ColumnHeaderHeight
        e.Graphics.FillRectangle(Brushes.LightGray, TextRect)
        e.Graphics.DrawRectangle(Pens.DarkGray, TextRect)
        'TextLeftPad adds a little padding from the gridline.
        'Add it to the left and subtract it from the right.
        TextRect.X += TextLeftPad
        TextRect.Width -= TextLeftPad
        e.Graphics.DrawString(ListView1.Columns(ColumnIndex).Text, ListView1.Font, Brushes.Black, TextRect, StringFormat)
        'Move the x position over the width of the column width.
        'Since I subtracted some padding add the padding back
        'when offsetting.
        X += TextRect.Width + TextLeftPad
    Next
    'Just drew the headers.  Move the Y down the height
    'of the column headers.
    Y += ColumnHeaderHeight
    'Now draw the items.  If this is the first page then the 
    'last index will be zero.  If its not then the last index
    'will be the last index we tried to draw but had no room.
    For i = LastIndex To ListView1.Items.Count - 1
        With ListView1.Items(i)
            'Start the x at the pages left margin.
            X = CInt(e.MarginBounds.X)
            'Check for Last Line
            If Y + .Bounds.Height > e.MarginBounds.Bottom Then
                'This item won't fit.
                'subtract 1 from i so the next time this sub
                'is entered we can start with this item.
                LastIndex = i - 1
                e.HasMorePages = True
                StringFormat.Dispose()
                'Draw the current page number before leaving.
                e.Graphics.DrawString(CStr(CurrentPage), ListView1.Font, Brushes.Black, (e.PageBounds.Width - PageNumberWidth) / 2, e.PageBounds.Bottom - ListView1.Font.Height * 2)
                Exit Sub
            End If
            'Print Images.
            'The image width is used so we can draw the gridline
            'around the image about to be drawn.  You'll see it 
            'below.
            ImageWidth = 0
            If ListView1.SmallImageList IsNot Nothing Then
                'If the image key is set then draw the image
                'with the key .  If not draw the image with the
                'index.  A tiny bit of validation would be good.
                If Not String.IsNullOrEmpty(.ImageKey) Then
                    e.Graphics.DrawImage(ListView1.SmallImageList.Images(.ImageKey), X, Y)
                ElseIf .ImageIndex >= 0 Then
                    e.Graphics.DrawImage(ListView1.SmallImageList.Images(.ImageIndex), X, Y)
                End If
                ImageWidth = ListView1.SmallImageList.ImageSize.Width
            End If
            'Now draw the subitems.  using the columns count so the 
            'grid lines can be drawn.  If used the subitems count then
            'the table would not be full if some subitems where less
            'than others.
            For ColumnIndex As Integer = 0 To ListView1.Columns.Count - 1
                TextRect.X = X
                TextRect.Y = Y
                TextRect.Width = ListView1.Columns(ColumnIndex).Width
                TextRect.Height = .Bounds.Height
                If ListView1.GridLines Then
                    e.Graphics.DrawRectangle(Pens.DarkGray, TextRect)
                End If
                'If an image is drawn then shift over the x to 
                'accomadate its width. If this was shifted before
                'now then the gridline with draw rect above would be
                ' on the wrong side of the image.
                If ColumnIndex = 0 Then TextRect.X += ImageWidth
                'Add a little padding from the gridline.
                TextRect.X += TextLeftPad
                TextRect.Width -= TextLeftPad
                If ColumnIndex < .SubItems.Count Then
                    'This item has at least the same number of
                    'subitems as the current column index.
                    e.Graphics.DrawString(.SubItems(ColumnIndex).Text, ListView1.Font, Brushes.Black, TextRect, StringFormat)
                End If
                'Shift the x of the width of this subitem.
                'Add some padding to the left side of the text
                'so need to add it back.
                X += TextRect.Width + TextLeftPad
            Next
            'Set the next line
            Y += .Bounds.Height
        End With
    Next
    'Draw the final page number.
    e.Graphics.DrawString(CStr(CurrentPage), ListView1.Font, Brushes.Black, (e.PageBounds.Width - PageNumberWidth) / 2, e.PageBounds.Bottom - ListView1.Font.Height * 2)
    StringFormat.Dispose()
    LastIndex = 0
    CurrentPage = 0
End Sub


What I have tried:

Code as above
Posted
Updated 17-May-16 6:31am
v2
Comments
Duncan Edwards Jones 17-May-16 12:33pm    
Do you want the header and footer on each page of the print, or just the first one?
Noor Phone 18-May-16 7:39am    
no just the first one, can you help with this please??
Duncan Edwards Jones 18-May-16 7:44am    
Ok - there are actually a number of things you need to do so first I suggest reading this article:- http://www.codeproject.com/Articles/27404/An-absolute-beginner-s-guide-to-printing-in-NET

Then you need an "If Currentpage = 0 Then" block that prints the header and footer bit, and also makes the area to print the list in smaller.
Sergey Alexandrovich Kryukov 17-May-16 13:00pm    
Please, what's the problem? From the first glance, you do things correctly. You print things per page; event arguments give you the size of the print area; on each page, you can render whatever you want.
—SA
Noor Phone 18-May-16 9:26am    
ok but how can i print labels in the first page then print the list view contents

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900