如何在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