Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vb.net 列表视图打印_Vb.net - Fatal编程技术网

Vb.net 列表视图打印

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

我发现了一些使用google进行listview打印的代码。我根据自己的需要修改了代码。如果列表查看多个页面,我会遇到一些问题。它不会停止计算我的文档的“生成预览”。如果我按“取消”,则会在多个页面中显示数据,但内容相同

如有任何建议,将不胜感激

提前谢谢

这是密码

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可能已经大于页面的高度