您的位置:首页 > 其它

数据表的打印

2005-07-29 13:30 225 查看
在VB.NET上写的,代码如下:
Imports System.Drawing.Printing
Public Class PrintDataGrid
Private PrintFont As New Font("宋体", 10)
Private PrintLines As Integer = 50
Private PrintRecordNumber As Integer = 45
Private DataGridSource As DataGrid
Private ev As PrintPageEventArgs
Private PrintDataGrid As PrintDocument
Private PrintPriview As PrintPreviewDialog
Private PageSetup As PageSetupDialog
Private PrintScale As Double = 1
Private DataGridColumn As DataColumn
Private DataGridRow As DataRow
Private DataGridTable As DataTable
Private Cols As Integer
Private Rows As Integer = 1
Private ColsCount As Integer
Private PrintingLineNumber As Integer = 0
Private PageRecordNumber As Integer
Dim X_unit As Integer
Dim Y_unit As Integer
Private PrintingPageNumber As Integer = 0
Private PageNumber As Integer
Private PrintRecordLeave As Integer
Private PrintRecordComplete As Integer = 0
Sub New(ByVal TableSource As DataGrid)
DataGridSource = TableSource
DataGridTable = New DataTable
Dim dv As DataView
dv = DataGridSource.DataSource()
DataGridTable = dv.Table
ColsCount = DataGridTable.Columns.Count
End Sub
'用户自定义字体及字号
Public WriteOnly Property setPrintFont() As System.Drawing.Font
Set(ByVal Value As System.Drawing.Font)
PrintFont = Value
End Set
End Property
'设置每页要打印的的记录条数
Public WriteOnly Property setPrintRecordNumber() As Integer
Set(ByVal Value As Integer)
PrintRecordNumber = Value
End Set
End Property
Public Sub Print()
Try
PrintDataGrid = New System.Drawing.Printing.PrintDocument
AddHandler PrintDataGrid.PrintPage, AddressOf Me.PrintDataGrid_PrintPage
PageSetup = New PageSetupDialog
PageSetup.PageSettings = PrintDataGrid.DefaultPageSettings
If PageSetup.ShowDialog() = DialogResult.Cancel Then
Exit Sub
End If
If PrintDataGrid.DefaultPageSettings.Landscape = False Then
PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Height / (PrintFont.Height + 20)
Else
PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Width / (PrintFont.Height + 20)
End If
If PrintDataGrid.DefaultPageSettings.PaperSize.PaperName.ToString = "custom" Then
End If
PrintPriview = New PrintPreviewDialog
PrintPriview.Document = PrintDataGrid
PrintPriview.ShowDialog()
Catch ex As Exception
MessageBox.Show("error:" & ex.ToString, "警告", MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Finally
End Try
End Sub
Private Sub PrintDataGrid_PrintPage(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)
Dim strPrint As String '当前要打印的文本
Dim DrawBrush As New SolidBrush(System.Drawing.Color.Blue)
Dim X As Integer
Dim Y As Integer
Dim DrawPoint As New PointF(X, Y)
Dim row_count As Integer
PrintRecordLeave = DataGridTable.Rows.Count - PrintRecordComplete
PageNumber = PrintRecordLeave / PrintRecordNumber
PrintingPageNumber = 0
If PrintDataGrid.DefaultPageSettings.Landscape = True Then
X_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Height / DataGridTable.Columns.Count '+1
Y_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Width / PrintLines
Else
X_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Width / DataGridTable.Columns.Count
Y_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Height / PrintLines
End If
If DataGridTable.Rows.Count - PrintingPageNumber * PrintRecordNumber >= PrintRecordNumber Then
PageRecordNumber = PrintRecordNumber
Else
PageRecordNumber = (DataGridTable.Rows.Count - PrintingPageNumber * PrintRecordNumber) Mod PrintRecordNumber
End If
While PrintingPageNumber <= PageNumber
strPrint = DataGridSource.CaptionText
DrawPoint = New PointF(X_unit, Y_unit)
ev.Graphics.DrawString(strPrint, PrintFont, DrawBrush, DrawPoint)
Dim ColumnText(DataGridTable.Columns.Count) As String
Dim Table As Integer
For Cols = 0 To DataGridTable.Columns.Count - 1
ColumnText(Cols) = DataGridTable.Columns(Cols).ToString
DrawPoint = New PointF(X_unit * (Cols + 1), Y_unit * 2)
ev.Graphics.DrawString(ColumnText(Cols), PrintFont, DrawBrush, DrawPoint)
Next
DrawPoint = New PointF(X_unit, Y_unit * 2)
Call DrawLine(DrawPoint, ev)
Dim PrintingLine As Integer = 0
Dim strUpData As String = ""
Dim strNonce As String = ""
While PrintingLine < PageRecordNumber
DataGridRow = DataGridTable.Rows(PrintRecordComplete)
For Cols = 0 To DataGridTable.Columns.Count - 1
DrawPoint.X = X_unit * (Cols + 1)
DrawPoint.Y = Y_unit * (PrintingLine + 1 + 2)
If Cols = 0 Then
If strUpData <> "" And strNonce <> "" Then '
If strUpData <> DataGridRow(ColumnText(0)) Then
ev.HasMorePages = True
Exit Sub
End If
End If
End If
Try
ev.Graphics.DrawString(DataGridRow(ColumnText(Cols)), PrintFont, DrawBrush, DrawPoint)
strUpData = DataGridRow(ColumnText(0))
Catch
MsgBox(ColumnText(Cols).GetType.ToString)
End Try
Next
DrawPoint.X = X_unit * 1
DrawPoint.Y = Y_unit * (PrintingLine + 1 + 2)
Call DrawLine(DrawPoint, ev)
PrintingLine += 1
PrintRecordComplete += 1
If PrintRecordComplete >= DataGridTable.Rows.Count Then
ev.HasMorePages = False
Exit Sub
End If
End While
PrintingPageNumber += 1
If PrintingPageNumber > PageNumber Then
ev.HasMorePages = False
Else
ev.HasMorePages = True
Exit While
End If
End While
End Sub
'画线只必指定当前行的打印文字的开始位置就可,x,y为当前行文字的打印位置
Private Sub DrawLine(ByVal point As PointF, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)
Dim blackPen As New Pen(System.Drawing.Color.Black, 1)
ev.Graphics.DrawLine(blackPen, point.X, point.Y + PrintFont.Height, point.X * (ColsCount + 1), point.Y + PrintFont.Height)
End Sub
End Class
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: