我在这里遇到的问题与我在此处发布的代码有关:How to print datagridview table with its header in vb.net?
我在没有打印机的情况下进行测试,只是将其另存为.pdf文件,但它并没有导出DataGridView
。谁能帮我?可能是什么问题?
如您所见,它在“打印预览”中可见:
我的代码:
Private mRow As Integer = 0
Private newpage As Boolean = True
Private Sub PrintDocument1_PrintPage(sender As Object, e As Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim rect As New Rectangle(12, 9, CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width), lblCurriculumName.Height)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
e.Graphics.DrawString(lblCurriculumName.Text, lblCurriculumName.Font, Brushes.Black, rect, sf)
sf.Alignment = StringAlignment.Center
Dim rect1 As New Rectangle(97, 60, CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width), txtFullName.Height)
Dim sf1 As New StringFormat
sf1.Alignment = StringAlignment.Near
sf1.LineAlignment = StringAlignment.Near
e.Graphics.DrawString(txtFullName.Text, txtFullName.Font, Brushes.Black, rect1, sf1)
sf1.Alignment = StringAlignment.Center
' sets it to show '...' for long text
Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
fmt.LineAlignment = StringAlignment.Center
fmt.Trimming = StringTrimming.EllipsisCharacter
Dim y As Int32 = e.MarginBounds.Top
Dim rc As Rectangle
Dim x As Int32
Dim h As Int32 = 0
Dim row As DataGridViewRow
' print the header text for a new page
' use a grey bg just like the control
If newpage Then
row = DataGridView1.Rows(mRow)
x = e.MarginBounds.Left
For Each cell As DataGridViewCell In row.Cells
' since we are printing the control's view,
' skip invidible columns
If cell.Visible Then
rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height)
e.Graphics.FillRectangle(Brushes.LightGray, rc)
e.Graphics.DrawRectangle(Pens.Black, rc)
' reused in the data pront - should be a function
Select Case DataGridView1.Columns(cell.ColumnIndex).DefaultCellStyle.Alignment
Case DataGridViewContentAlignment.BottomRight,
DataGridViewContentAlignment.MiddleRight
fmt.Alignment = StringAlignment.Far
rc.Offset(-1, 0)
Case DataGridViewContentAlignment.BottomCenter,
DataGridViewContentAlignment.MiddleCenter
fmt.Alignment = StringAlignment.Center
Case Else
fmt.Alignment = StringAlignment.Near
rc.Offset(2, 0)
End Select
e.Graphics.DrawString(DataGridView1.Columns(cell.ColumnIndex).HeaderText,
DataGridView1.Font, Brushes.Black, rc, fmt)
x += rc.Width
h = Math.Max(h, rc.Height)
End If
Next
y += h
End If
newpage = False
' now print the data for each row
Dim thisNDX As Int32
For thisNDX = mRow To DataGridView1.RowCount - 1
' no need to try to print the new row
If DataGridView1.Rows(thisNDX).IsNewRow Then Exit For
row = DataGridView1.Rows(thisNDX)
x = e.MarginBounds.Left
h = 0
' reset X for data
x = e.MarginBounds.Left
' print the data
For Each cell As DataGridViewCell In row.Cells
If cell.Visible Then
rc = New Rectangle(x, y, cell.Size.Width, cell.Size.Height)
' pick up any RowPrePaint rule
If Convert.ToString(row.Cells(2).Value.ToString) = "NG" Then
Using br As New SolidBrush(Color.MistyRose)
e.Graphics.FillRectangle(br, rc)
End Using
End If
e.Graphics.DrawRectangle(Pens.Black, rc)
Select Case DataGridView1.Columns(cell.ColumnIndex).DefaultCellStyle.Alignment
Case DataGridViewContentAlignment.BottomRight,
DataGridViewContentAlignment.MiddleRight
fmt.Alignment = StringAlignment.Far
rc.Offset(-1, 0)
Case DataGridViewContentAlignment.BottomCenter,
DataGridViewContentAlignment.MiddleCenter
fmt.Alignment = StringAlignment.Center
Case Else
fmt.Alignment = StringAlignment.Near
rc.Offset(2, 0)
End Select
e.Graphics.DrawString(cell.FormattedValue.ToString(),
DataGridView1.Font, Brushes.Black, rc, fmt)
x += rc.Width
h = Math.Max(h, rc.Height)
End If
Next
y += h
' next row to print
mRow = thisNDX + 1
If y + h > e.MarginBounds.Bottom Then
e.HasMorePages = True
mRow -= 1 'causes last row to rePrint on next page
newpage = True
Return
End If
Next
End Sub
Private Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click
'need to start fresh each time
mRow = 0
newpage = True
PrintPreviewDialog1.Document = PrintDocument1
'optionally reset the first page shown
PrintPreviewDialog1.PrintPreviewControl.StartPage = 0
PrintPreviewDialog1.WindowState = FormWindowState.Maximized
PrintPreviewDialog1.ShowDialog()
End Sub
答案 0 :(得分:2)
文档打印为预览后,如果您决定打印,则必须再次打印文档。这意味着PrintDocument1_PrintPage
中的所有代码都必须再次运行,这次将输出发送到打印机。
但是,在预览结束时,mRow
将是DGV行的最大数量,newpage
为false,因此无法打印任何内容。解决方案是初始化BeginPrint
事件中的那些:
Private Sub PrintDocument1_BeginPrint(sender As Object,
e As PrintEventArgs) Handles PrintDocument1.BeginPrint
mRow = 0
newpage = True
PrintPreviewDialog1.PrintPreviewControl.StartPage = 0
PrintPreviewDialog1.PrintPreviewControl.Zoom = 1.0
End Sub
现在,当打印机再次开始打印时,它们将设置为处理整个文档。该代码还会重置要显示的第一页和初始缩放。