Vb.net 列表视图打印
我发现了一些使用google进行listview打印的代码。我根据自己的需要修改了代码。如果列表查看多个页面,我会遇到一些问题。它不会停止计算我的文档的“生成预览”。如果我按“取消”,则会在多个页面中显示数据,但内容相同 如有任何建议,将不胜感激 提前谢谢 这是密码Vb.net 列表视图打印,vb.net,Vb.net,我发现了一些使用google进行listview打印的代码。我根据自己的需要修改了代码。如果列表查看多个页面,我会遇到一些问题。它不会停止计算我的文档的“生成预览”。如果我按“取消”,则会在多个页面中显示数据,但内容相同 如有任何建议,将不胜感激 提前谢谢 这是密码 Public Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Dim pd As New
Public Sub pd_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs)
Dim pd As New PrintDocument
Dim CurrRow As Integer = 0
Dim Ratio As Single = 0
Dim c As ColumnHeader
Dim g As Graphics = e.Graphics
Dim l As Integer = 0 'stores current left
Dim iCount As Integer
Dim f As Font = lsvToPrint.Font
Dim FontBold As New System.Drawing.Font("Microsoft Sans Serif", 10, FontStyle.Bold)
Dim b As Brush = Brushes.Black
Dim currentY As Integer = 0
Dim maxY As Integer = 0
Dim gap As Integer = 5
Dim lvsi As ListViewItem.ListViewSubItem
Dim colLefts(lsvToPrint.Columns.Count) As Integer
Dim colWidths(lsvToPrint.Columns.Count) As Integer
Dim idx As Integer = 0
Dim ii As Integer
Dim lr As RectangleF
e.HasMorePages = False
'Page Settings
Dim PSize As Integer = lsvToPrint.Items.Count
Dim PHi As Double
With pd.DefaultPageSettings
Dim Ps As PaperSize
PHi = PSize * 20 + 350
Ps = New PaperSize("Cust", 800, PHi)
.Margins.Top = 15
.Margins.Bottom = 20
.PaperSize = Ps
End With
Dim sfc As New StringFormat
sfc.LineAlignment = StringAlignment.Center
sfc.Alignment = StringAlignment.Center
'Title
Dim headfont As Font
Dim X1 As Integer
Dim Y As Integer
headfont = New Font("Courier New", 16, FontStyle.Bold)
X1 = pd.DefaultPageSettings.Margins.Left
Y = pd.DefaultPageSettings.Margins.Top + 5
With pd.DefaultPageSettings
e.Graphics.DrawLine(Pens.Black, 0, Y + 70, e.PageBounds.Width, Y + 70)
End With
'Headings
currentY = 100
For Each c In lsvToPrint.Columns
maxY = Math.Max(maxY, g.MeasureString(c.Text, f, c.Width).Height)
colLefts(idx) = l
colWidths(idx) = c.Width
lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY)
If lr.Width > 0 Then g.DrawString(c.Text, FontBold, b, lr, sfc)
l += c.Width
idx += 1
Next
currentY += maxY + gap
g.DrawLine(Pens.Black, 0, currentY, e.PageBounds.Width, currentY)
currentY += gap
'Rows
iCount = lsvToPrint.Items.Count - 1
For ii = CurrRow To iCount
If (currentY + maxY + maxY) > e.PageBounds.Height Then 'jump down another line to see if this line will fit
CurrRow = ii - 1
e.HasMorePages = True
currentY += maxY + gap
Exit For 'does next page
End If
l = 0
maxY = 0
idx = 0
For Each lvsi In lsvToPrint.Items(ii).SubItems
maxY = Math.Max(maxY, g.MeasureString(lvsi.Text, f, colWidths(idx)).Height)
lr = New RectangleF(colLefts(idx), currentY, colWidths(idx), maxY)
If lsvToPrint.Columns(idx).Text <> "Name" Then
If lr.Width > 0 Then g.DrawString(lvsi.Text , f, b, lr, sfc)
Else
If lr.Width > 0 Then g.DrawString(lvsi.Text, f, b, lr)
End If
idx += 1
Next
currentY += maxY + gap
Next
End Sub
Public Sub pd_PrintPage(ByVal sender作为对象,ByVal e作为System.Drawing.Printing.PrintPageEventArgs)
Dim pd作为新的打印文档
按整数表示的行数=0
单个尺寸比=0
Dim c作为列标题
尺寸g为图形=e.图形
Dim l为整数=0'存储当前左侧
Dim I以整数形式计数
尺寸f为Font=lsvToPrint.Font
Dim FontBold作为新的System.Drawing.Font(“Microsoft无衬线”,10,FontStyle.Bold)
调暗b为刷子=刷子。黑色
Dim currentY为整数=0
Dim maxY作为整数=0
将间隙调整为整数=5
将lvsi调整为ListViewItem.ListViewSubItem
将集合(lsvToPrint.Columns.Count)设置为整数
Dim COLWITHS(lsvToPrint.Columns.Count)为整数
Dim idx作为整数=0
作为整数的Dim ii
变暗lr为矩形F
e、 HasMorePages=False
'页面设置
Dim PSize As Integer=lsvToPrint.Items.Count
暗PHi为双精度
使用pd.DefaultPageSettings
将Ps调暗为纸张大小
φ=PSize*20+350
Ps=新纸张尺寸(“Cust”,800,PHi)
.页边距.页首=15
.Margins.Bottom=20
.PaperSize=Ps
以
Dim sfc作为新格式
sfc.LineAlignment=StringAlignment.Center
sfc.Alignment=StringAlignment.Center
"标题",
作为字体的暗淡字体
作为整数的Dim X1
Dim Y作为整数
headfont=新字体(“Courier New”,16,FontStyle.Bold)
X1=pd.DefaultPageSettings.Margins.Left
Y=pd.DefaultPageSettings.Margins.Top+5
使用pd.DefaultPageSettings
e、 图形.绘图线(钢笔.黑色,0,Y+70,e.PageBounds.Width,Y+70)
以
“标题
电流Y=100
对于lsvtoprit.列中的每个c
maxY=Math.Max(maxY,g.MeasureString(c.Text,f,c.Width).Height)
学院(idx)=l
冷宽(idx)=c.宽度
lr=新矩形F(夹头(idx)、电流Y、冷宽(idx)、最大值)
如果lr.Width>0,则g.DrawString(c.Text、FontBold、b、lr、sfc)
l+=c.宽度
idx+=1
下一个
电流Y+=最大Y+间隙
g、 抽绳(钢笔,黑色,0,当前Y,e.PageBounds.Width,当前Y)
电流Y+=间隙
“行
iCount=lsvToPrint.Items.Count-1
对于ii=要计数的当前行
如果(currentY y+maxY+maxY)>e.PageBounds.Height,则“跳下另一行,查看该行是否适合”
CurrRow=ii-1
e、 HasMorePages=True
电流Y+=最大Y+间隙
退出下一页
如果结束
l=0
maxY=0
idx=0
对于lsvToPrint.项目(ii).子项目中的每个lvsi
maxY=Math.Max(maxY,g.MeasureString(lvsi.Text,f,colWidths(idx)).Height)
lr=新矩形F(夹头(idx)、电流Y、冷宽(idx)、最大值)
如果lsvToPrint.Columns(idx).Text“Name”,则
如果lr.Width>0,则g.DrawString(lvsi.Text、f、b、lr、sfc)
其他的
如果lr.Width>0,则g.DrawString(lvsi.Text、f、b、lr)
如果结束
idx+=1
下一个
电流Y+=最大Y+间隙
下一个
端接头
确保补偿新页面的最大高度。在第一页上可以,但是当它进入下一页时,CurrentY+MaxY可能已经大于页面的高度