如何在vb.net中打印listview表格?

如何在vb.net中打印listview表格?,vb.net,Vb.net,您好,我需要打印我的列表视图,但我不确定如何打印?公共类列表视图打印机 Public Class listViewPrinter Private lv As ListView Private location As Point Private border As Boolean Private title As String Private titleHeight As Integer Private hLines As Boolean

您好,我需要打印我的
列表视图
,但我不确定如何打印?

公共类列表视图打印机
Public Class listViewPrinter

    Private lv As ListView
    Private location As Point
    Private border As Boolean
    Private title As String
    Private titleHeight As Integer
    Private hLines As Boolean
    Private vLines As Boolean

    Private WithEvents pd As New Printing.PrintDocument

    Public Sub New(ByVal lv As ListView, ByVal location As Point, ByVal border As Boolean, ByVal _hLines As Boolean, ByVal _vLines As Boolean, Optional ByVal title As String = "")
        Me.lv = lv
        Me.location = location
        Me.border = border
        Me.title = title
        Me.hLines = _hLines
        Me.vLines = _vLines
        titleHeight = If(title <> "", lv.FindForm.CreateGraphics.MeasureString(title, New Font(lv.Font.Name, 25)).ToSize.Height, 0)
    End Sub

    Public Sub print()
        'pd.Print()
        Dim ppd As New PrintPreviewDialog
        ppd.Document = pd
        ppd.WindowState = FormWindowState.Maximized
        ppd.ShowDialog()
    End Sub

    Private Structure pageDetails       ' structure to hold printed page details
        Dim columns As Integer
        Dim rows As Integer
        Dim startCol As Integer
        Dim startRow As Integer
        Dim headerIndices As List(Of Integer)
    End Structure

    Private pages As Dictionary(Of Integer, pageDetails)        ' dictionary to hold printed page details, with index key
    Dim maxPagesWide As Integer
    Dim maxPagesTall As Integer
    Dim items() As ListViewItem

    ' the majority of this Sub is calculating printed page ranges
    Private Sub pd_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles pd.BeginPrint
        pd.DefaultPageSettings.Landscape = True
        pd.OriginAtMargins = True   'this removes the printed page margins
        pd.DefaultPageSettings.Margins = New Drawing.Printing.Margins(location.X, location.X, location.Y, location.Y)
        pages = New Dictionary(Of Integer, pageDetails)
        ' Reversed MaxWidth & MaxHeight for landscape page...
        'Dim maxWidth As Integer = CInt(pd.DefaultPageSettings.PrintableArea.Width) - (pd.DefaultPageSettings.Margins.Left + pd.DefaultPageSettings.Margins.Right + 40)
        'Dim maxHeight As Integer = CInt(pd.DefaultPageSettings.PrintableArea.Height - (titleHeight + 12)) - (pd.DefaultPageSettings.Margins.Top + pd.DefaultPageSettings.Margins.Bottom + 40)
        Dim maxWidth As Integer = CInt(pd.DefaultPageSettings.PrintableArea.Height) - (pd.DefaultPageSettings.Margins.Left + pd.DefaultPageSettings.Margins.Right + 0)
        Dim maxHeight As Integer = CInt(pd.DefaultPageSettings.PrintableArea.Width - (titleHeight + 12)) - (pd.DefaultPageSettings.Margins.Top + pd.DefaultPageSettings.Margins.Bottom + 0)

        Dim pageCounter As Integer = 0
        pages.Add(pageCounter, New pageDetails With {.headerIndices = New List(Of Integer)})
        Dim columnCounter As Integer = 0
        Dim columnSum As Integer = 0

        For c As Integer = 0 To lv.Columns.Count - 1
            If columnSum + lv.Columns(c).Width < maxWidth Then
                columnSum += lv.Columns(c).Width
                columnCounter += 1
            Else
                pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol, .headerIndices = pages(pageCounter).headerIndices}
                columnSum = lv.Columns(c).Width
                columnCounter = 1
                pageCounter += 1
                pages.Add(pageCounter, New pageDetails With {.startCol = c, .headerIndices = New List(Of Integer)})
            End If
            If c = lv.Columns.Count - 1 Then
                If pages(pageCounter).columns = 0 Then
                    pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol, .headerIndices = pages(pageCounter).headerIndices}
                End If
            End If
        Next
        maxPagesWide = pages.Keys.Max + 1
        pageCounter = 0
        Dim rowCounter As Integer = 0
        Dim counter As Integer = 0
        Dim itemHeight As Integer = lv.GetItemRect(0).Height
        Dim rowSum As Integer = itemHeight

        For r As Integer = 0 To lv.Items.Count - 1
            counter += 1
            If rowSum + itemHeight < maxHeight Then
                rowSum += itemHeight
                rowCounter += 1
            Else
                pages(pageCounter) = New pageDetails With {.columns = pages(pageCounter).columns, .rows = rowCounter, .startCol = pages(pageCounter).startCol, .startRow = pages(pageCounter).startRow}
                For x As Integer = 1 To maxPagesWide - 1
                    pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter).startRow}
                Next
                pageCounter += maxPagesWide
                For x As Integer = 0 To maxPagesWide - 1
                    pages.Add(pageCounter + x, New pageDetails With {.columns = pages(x).columns, .rows = 0, .startCol = pages(x).startCol, .startRow = counter - 1})
                Next
                rowSum = itemHeight * 2
                rowCounter = 1
            End If
            If counter = lv.Items.Count Then
                For x As Integer = 0 To maxPagesWide - 1
                    If pages(pageCounter + x).rows = 0 Then
                        pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter + x).startRow}
                    End If
                Next
            End If
        Next
        maxPagesTall = pages.Count \ maxPagesWide
        items = lv.Items.Cast(Of ListViewItem).ToArray
    End Sub


    Private Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles pd.PrintPage
        Dim sf As New StringFormat
        sf.Alignment = StringAlignment.Center
        sf.LineAlignment = StringAlignment.Center

        Dim r2 As New Rectangle(location, New Size(lv.Columns.Cast(Of ColumnHeader).Skip(pages(0).startCol).Take(pages(0).columns).Sum(Function(ch As ColumnHeader) ch.Width), titleHeight))
        e.Graphics.DrawString(title, New Font(lv.Font.Name, 25), Brushes.Black, r2, sf)
        sf.Alignment = StringAlignment.Near
        Dim startX As Integer = location.X
        Dim startY As Integer = location.Y + titleHeight + 12
        Static startPage As Integer = 0
        Dim itemHeight As Integer = lv.GetItemRect(0).Height
        Dim bottomRight As Point

        For p As Integer = startPage To pages.Count - 1
            startX = location.X
            startY = location.Y + titleHeight + 12
            Dim cell As Rectangle
            For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
                cell = New Rectangle(startX, startY, lv.Columns(c).Width, itemHeight)
                e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
                e.Graphics.DrawRectangle(Pens.Black, cell)
                e.Graphics.DrawString(lv.Columns(c).Text, lv.Font, Brushes.Black, cell, sf)
                startX += lv.Columns(c).Width
            Next
            startY += itemHeight
            startX = location.X
            For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
                startX = location.X
                For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
                    cell = New Rectangle(startX, startY, lv.Columns(c).Width, itemHeight)
                    e.Graphics.DrawString(items(r).SubItems(c).Text, lv.Font, Brushes.Black, cell, sf)
                    If vLines Then
                        e.Graphics.DrawLine(Pens.Black, cell.Left, cell.Top, cell.Left, cell.Bottom)
                        e.Graphics.DrawLine(Pens.Black, cell.Right, cell.Top, cell.Right, cell.Bottom)
                    End If
                    If hLines Then
                        e.Graphics.DrawLine(Pens.Black, cell.Left, cell.Top, cell.Right, cell.Top)
                        e.Graphics.DrawLine(Pens.Black, cell.Left, cell.Bottom, cell.Right, cell.Bottom)
                    End If
                    startX += lv.Columns(c).Width
                Next
                startY += itemHeight
                If r = pages(p).startRow + pages(p).rows - 1 Then
                    bottomRight = New Point(startX, startY)
                    If border Then e.Graphics.DrawRectangle(Pens.Black, New Rectangle(location, New Size(bottomRight.X - location.X, bottomRight.Y - location.Y)))
                End If
            Next
            If p <> pages.Count - 1 Then
                startPage = p + 1
                e.HasMorePages = True
                Return
            Else
                startPage = 0
            End If
        Next
    End Sub

End Class
私有lv作为ListView 作为点的私有位置 作为布尔值的私有边界 私有所有权作为字符串 作为整数的私有标题权 作为布尔值的私有hline 作为布尔函数的私有vline Private WithEvents pd作为新的Printing.PrintDocument Public Sub-New(ByVal lv作为列表视图,ByVal location作为点,ByVal border作为布尔值,ByVal_hLines作为布尔值,ByVal_vLines作为布尔值,可选的ByVal title作为String=”“) Me.lv=lv Me.location=位置 Me.border=边界 Me.title=头衔 Me.hLines=\u hLines Me.vLines=\u vLines titleLight=If(title“”,lv.FindForm.CreateGraphics.MeasureString(title,新字体(lv.Font.Name,25))。ToSize.Height,0) 端接头 公共子打印() "pd.Print() 将ppd设置为新的打印预览对话框 ppd.Document=pd ppd.WindowState=FormWindowState.Maximized ppd.ShowDialog() 端接头 用于保存打印页面详细信息的私有结构pageDetails的结构 将列设置为整数 将行设置为整数 Dim startCol作为整数 Dim startRow为整数 Dim HEADERINDIES作为列表(整数) 端部结构 专用页面作为字典(整型,pageDetails)'用于保存打印页面详细信息的字典,带有索引键 Dim maxPagesWide为整数 Dim maxPagesTall为整数 Dim items()作为ListViewItem '此Sub的大部分是计算打印页面范围 私有子pd_BeginPrint(ByVal sender作为对象,ByVal e作为System.Drawing.Printing.PrintEventArgs)处理pd.BeginPrint pd.DefaultPageSettings.横向=真 pd.originalmargins=True'这将删除打印页边距 pd.DefaultPageSettings.Margins=新绘图.打印.页边距(location.X,location.X,location.Y,location.Y) pages=新字典(整型,pageDetails) '反转横向页面的最大宽度和最大高度。。。 'Dim maxWidth As Integer=CInt(pd.DefaultPageSettings.PrintableArea.Width)-(pd.DefaultPageSettings.Margins.Left+pd.DefaultPageSettings.Margins.Right+40) 'Dim maxHeight As Integer=CInt(pd.DefaultPageSettings.PrintableArea.Height-(TitleLight+12))-(pd.DefaultPageSettings.Margins.Top+pd.DefaultPageSettings.Margins.Bottom+40) Dim maxWidth As Integer=CInt(pd.DefaultPageSettings.PrintableArea.Height)-(pd.DefaultPageSettings.Margins.Left+pd.DefaultPageSettings.Margins.Right+0) Dim maxHeight As Integer=CInt(pd.DefaultPageSettings.PrintableArea.Width-(titleLight+12))-(pd.DefaultPageSettings.Margins.Top+pd.DefaultPageSettings.Margins.Bottom+0) Dim pageCounter为整数=0 Add(pageCounter,带有{.headerIndices=新列表(整数)}的新页面详细信息) Dim columnCounter作为整数=0 Dim columnSum作为整数=0 对于c,整数=0到lv.Columns.Count-1 如果columnSum+lv.Columns(c).Width