|
 |
栏目导栏 |
|
| |
|
|
|
|
 |
资料搜索 |
|
| |
|
|
|
|
 |
热门文章 |
|
| |
|
|
|
|
 |
最新文章 |
|
| |
|
|
|
| |
| |
|
|
|
|
Imports System.Drawing.Printing UL3Linux联盟 Imports System.Drawing.Color UL3Linux联盟 Imports System.Windows.Forms UL3Linux联盟 Imports System.Drawing.Font UL3Linux联盟 Imports System.Drawing.PointF UL3Linux联盟 Imports System.Windows.Forms.DataGrid UL3Linux联盟 Imports System.Drawing.Pen UL3Linux联盟 Imports System.Drawing UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 ''======================================= UL3Linux联盟 'DATAGRID控件通用打印类 UL3Linux联盟 '中和科技-孙利臣 UL3Linux联盟 '于2003年05月27日17:05 UL3Linux联盟 '用于打印DATAGRID控件中的数据. UL3Linux联盟 UL3Linux联盟 '======================================= UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 Public Class PrintDataGrid UL3Linux联盟 '用户可自定义 UL3Linux联盟 Private PrintFont As New Font("宋体", 10) '当前要打印文本的字体及字号 UL3Linux联盟 Private PrintLines As Integer = 50 '当前页共要分成多少行. UL3Linux联盟 Private PrintRecordNumber As Integer = 45 '当前页共要打印的记录的行数 UL3Linux联盟 UL3Linux联盟 '以下为模块内部使用 UL3Linux联盟 Private DataGridSource As DataGrid UL3Linux联盟 Private ev As PrintPageEventArgs UL3Linux联盟 Private PrintDataGrid As PrintDocument UL3Linux联盟 Private PrintPriview As PrintPreviewDialog UL3Linux联盟 Private PageSetup As PageSetupDialog UL3Linux联盟 Private PrintScale As Double = 1 '当前要打印的数据与DATAGRID控件内数据的比例 UL3Linux联盟 UL3Linux联盟 Private DataGridColumn As DataColumn UL3Linux联盟 Private DataGridRow As DataRow UL3Linux联盟 Private DataGridTable As DataTable UL3Linux联盟 UL3Linux联盟 Private Cols As Integer '当前要打印的列 UL3Linux联盟 Private Rows As Integer = 1 '当前要打印的行 UL3Linux联盟 UL3Linux联盟 Private ColsCount As Integer '当前DATAGRID共有多少列 UL3Linux联盟 UL3Linux联盟 Private PrintingLineNumber As Integer = 0 '当前正要打印的行号 UL3Linux联盟 Private PageRecordNumber As Integer '当前要所要打印的记录行数,由计算得到. UL3Linux联盟 UL3Linux联盟 Dim X_unit As Integer '表的基本单位 UL3Linux联盟 Dim Y_unit As Integer UL3Linux联盟 UL3Linux联盟 Private PrintingPageNumber As Integer = 0 '正要打印的页号 UL3Linux联盟 UL3Linux联盟 Private PageNumber As Integer '共需要打印的页数 UL3Linux联盟 Private PrintRecordLeave As Integer '当前还有多少页没有打印 UL3Linux联盟 Private PrintRecordComplete As Integer = 0 '已经打印完的记录数 UL3Linux联盟 UL3Linux联盟 Sub New(ByVal TableSource As DataGrid) UL3Linux联盟 DataGridSource = TableSource UL3Linux联盟 DataGridTable = New DataTable() UL3Linux联盟 DataGridTable = DataGridSource.DataSource() UL3Linux联盟 ColsCount = DataGridTable.Columns.Count UL3Linux联盟 End Sub UL3Linux联盟 UL3Linux联盟 '用户自定义字体及字号 UL3Linux联盟 Public WriteOnly Property setPrintFont() As System.Drawing.Font UL3Linux联盟 Set(ByVal Value As System.Drawing.Font) UL3Linux联盟 PrintFont = Value UL3Linux联盟 End Set UL3Linux联盟 End Property UL3Linux联盟 UL3Linux联盟 '设置每页要打印的的记录条数 UL3Linux联盟 Public WriteOnly Property setPrintRecordNumber() As Integer UL3Linux联盟 Set(ByVal Value As Integer) UL3Linux联盟 PrintRecordNumber = Value UL3Linux联盟 End Set UL3Linux联盟 End Property UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 Public Sub Print() UL3Linux联盟 Try UL3Linux联盟 PrintDataGrid = New System.Drawing.Printing.PrintDocument() UL3Linux联盟 AddHandler PrintDataGrid.PrintPage, AddressOf Me.PrintDataGrid_PrintPage UL3Linux联盟 'PrintDataTable.Print() UL3Linux联盟 UL3Linux联盟 '打印机设置对话框 UL3Linux联盟 PageSetup = New PageSetupDialog() UL3Linux联盟 PageSetup.PageSettings = PrintDataGrid.DefaultPageSettings UL3Linux联盟 If PageSetup.ShowDialog() = DialogResult.Cancel Then UL3Linux联盟 Exit Sub UL3Linux联盟 End If UL3Linux联盟 UL3Linux联盟 '当前页是横向还是纵向打印 UL3Linux联盟 '计算当前页总共可以打印的行数 UL3Linux联盟 If PrintDataGrid.DefaultPageSettings.Landscape = False Then UL3Linux联盟 PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Height / (PrintFont.Height + 5) UL3Linux联盟 Else UL3Linux联盟 PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Width / (PrintFont.Height + 5) UL3Linux联盟 End If UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 '如果用户选择自定义纸张大小打印,则按B5纸打印,不管实际纸张大小 UL3Linux联盟 If PrintDataGrid.DefaultPageSettings.PaperSize.PaperName.ToString = "custom" Then UL3Linux联盟 UL3Linux联盟 End If UL3Linux联盟 UL3Linux联盟 '预览窗口 UL3Linux联盟 PrintPriview = New PrintPreviewDialog() UL3Linux联盟 PrintPriview.Document = PrintDataGrid UL3Linux联盟 PrintPriview.ShowDialog() UL3Linux联盟 UL3Linux联盟 Catch ex As Exception UL3Linux联盟 MessageBox.Show("error:" & ex.ToString) UL3Linux联盟 Finally UL3Linux联盟 UL3Linux联盟 End Try UL3Linux联盟 End Sub UL3Linux联盟 UL3Linux联盟 Private Sub PrintDataGrid_PrintPage(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs) UL3Linux联盟 UL3Linux联盟 'A4纸 A4 纸,210 x 297 毫米。 UL3Linux联盟 'B5纸 B5 纸,182 x 257 毫米。 UL3Linux联盟 UL3Linux联盟 Dim strPrint As String '当前要打印的文本 UL3Linux联盟 Dim DrawBrush As New SolidBrush(System.Drawing.Color.Blue) '当前画笔颜色 UL3Linux联盟 UL3Linux联盟 Dim X As Integer '当前要打印的文本的横坐标 UL3Linux联盟 Dim Y As Integer '当前要打印的文本的列坐标 UL3Linux联盟 UL3Linux联盟 Dim DrawPoint As New PointF(X, Y) UL3Linux联盟 UL3Linux联盟 Dim row_count As Integer '当前要打印的行 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 PrintRecordLeave = DataGridTable.Rows.Count - PrintRecordComplete '还有多少条记录没有打印 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 PageNumber = PrintRecordLeave / PrintRecordNumber '共需要打印的页数 UL3Linux联盟 PrintingPageNumber = 0 '因为每打印一个新页都要计算还有多少页没有打印所以以打印的页数初始为0 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 '将当前页分成基本的单元 UL3Linux联盟 If PrintDataGrid.DefaultPageSettings.Landscape = True Then UL3Linux联盟 X_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Height / (DataGridTable.Columns.Count + 2) UL3Linux联盟 Y_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Width / PrintLines UL3Linux联盟 UL3Linux联盟 Else UL3Linux联盟 X_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Width / (DataGridTable.Columns.Count + 2) UL3Linux联盟 Y_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Height / PrintLines UL3Linux联盟 UL3Linux联盟 End If UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 '计算,余下的记录条数是否还可以在一页打印,不满一页时为假 UL3Linux联盟 If DataGridTable.Rows.Count - PrintingPageNumber * PrintRecordNumber >= PrintRecordNumber Then UL3Linux联盟 PageRecordNumber = PrintRecordNumber UL3Linux联盟 Else UL3Linux联盟 PageRecordNumber = (DataGridTable.Rows.Count - PrintingPageNumber * PrintRecordNumber) Mod PrintRecordNumber UL3Linux联盟 End If UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 While PrintingPageNumber <= PageNumber UL3Linux联盟 UL3Linux联盟 '文档标题----------------打印开始 UL3Linux联盟 strPrint = DataGridSource.CaptionText '文档标题 UL3Linux联盟 DrawPoint = New PointF(X_unit, Y_unit) UL3Linux联盟 ev.Graphics.DrawString(strPrint, PrintFont, DrawBrush, DrawPoint) UL3Linux联盟 '文档标题----------------打印结束 UL3Linux联盟 UL3Linux联盟 '得到DATAGRID的所有列名 UL3Linux联盟 Dim ColumnText(DataGridTable.Columns.Count) As String UL3Linux联盟 Dim Table As Integer UL3Linux联盟 UL3Linux联盟 For Cols = 0 To DataGridTable.Columns.Count - 1 UL3Linux联盟 UL3Linux联盟 ColumnText(Cols) = DataGridTable.Columns(Cols).ToString '得到当前所有的列名 UL3Linux联盟 UL3Linux联盟 DrawPoint = New PointF(X_unit * (Cols + 1), Y_unit * 2) UL3Linux联盟 ev.Graphics.DrawString(ColumnText(Cols), PrintFont, DrawBrush, DrawPoint) UL3Linux联盟 UL3Linux联盟 Next UL3Linux联盟 UL3Linux联盟 DrawPoint = New PointF(X_unit, Y_unit * 2) UL3Linux联盟 Call DrawLine(DrawPoint, ev) '画线 UL3Linux联盟 '结束---------------------得到DATAGRID的所有列名 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 Dim PrintingLine As Integer = 0 '当前页面已经打印的记录行数 UL3Linux联盟 UL3Linux联盟 '用于确定是否换页的标记 UL3Linux联盟 Dim strUpData As String = "" '当前数据的前一个数据 UL3Linux联盟 Dim strNonce As String = "" '当前数据 UL3Linux联盟 UL3Linux联盟 While PrintingLine < PageRecordNumber UL3Linux联盟 UL3Linux联盟 DataGridRow = DataGridTable.Rows(PrintRecordComplete) '确定要当前要打印的记录的行号 UL3Linux联盟 For Cols = 0 To DataGridTable.Columns.Count - 1 UL3Linux联盟 DrawPoint.X = X_unit * (Cols + 1) UL3Linux联盟 DrawPoint.Y = Y_unit * (PrintingLine + 1 + 2) UL3Linux联盟 UL3Linux联盟 If Cols = 0 Then '所要根据此列的数据分页 UL3Linux联盟 If strUpData <> "" Then 'And strNonce <> "" UL3Linux联盟 If strUpData <> DataGridRow(ColumnText(0)) Then UL3Linux联盟 ev.HasMorePages = True UL3Linux联盟 Exit Sub UL3Linux联盟 UL3Linux联盟 End If UL3Linux联盟 End If UL3Linux联盟 End If UL3Linux联盟 UL3Linux联盟 ev.Graphics.DrawString(DataGridRow(ColumnText(Cols)), PrintFont, DrawBrush, DrawPoint) UL3Linux联盟 strUpData = DataGridRow(ColumnText(0)) '当前行数据打印完成后,将打记录的第一列保存,(也可不用此语句,只为明确) UL3Linux联盟 Next UL3Linux联盟 UL3Linux联盟 DrawPoint.X = X_unit * 1 UL3Linux联盟 DrawPoint.Y = Y_unit * (PrintingLine + 1 + 2) UL3Linux联盟 UL3Linux联盟 Call DrawLine(DrawPoint, ev) UL3Linux联盟 UL3Linux联盟 PrintingLine += 1 UL3Linux联盟 PrintRecordComplete += 1 UL3Linux联盟 UL3Linux联盟 '打印完最后一条记录后结束打印. UL3Linux联盟 '如:当前有500条记录.从0开始打印,实际打印的为第一条记录.则打印500条时实际的是第501条记录.也就是最后一条 UL3Linux联盟 'datagridtable.rows.count得到就是表内的实际记录条数,共有多少条记录(从1开始),当 UL3Linux联盟 'printrecordcomplete>=datagridtable.rows.count也就是当前已经打印到了500条,加1后将要打印第501条,越界,则结束. UL3Linux联盟 If PrintRecordComplete >= DataGridTable.Rows.Count Then UL3Linux联盟 ev.HasMorePages = False UL3Linux联盟 Exit Sub UL3Linux联盟 End If UL3Linux联盟 End While UL3Linux联盟 UL3Linux联盟 PrintingPageNumber += 1 UL3Linux联盟 If PrintingPageNumber > PageNumber Then UL3Linux联盟 ev.HasMorePages = False UL3Linux联盟 Else UL3Linux联盟 UL3Linux联盟 ev.HasMorePages = True UL3Linux联盟 Exit While UL3Linux联盟 End If UL3Linux联盟 UL3Linux联盟 End While UL3Linux联盟 UL3Linux联盟 End Sub UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 '画线 只必指定当前行的打印文字的开始位置就可,x,y为当前行文字的打印位置 UL3Linux联盟 Private Sub DrawLine(ByVal point As PointF, ByVal ev As System.Drawing.Printing.PrintPageEventArgs) UL3Linux联盟 Dim blackPen As New Pen(System.Drawing.Color.Black, 1) UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 ev.Graphics.DrawLine(blackPen, point.X, point.Y + PrintFont.Height, point.X * (ColsCount + 1), point.Y + PrintFont.Height) UL3Linux联盟 UL3Linux联盟 End Sub UL3Linux联盟 UL3Linux联盟 End Class UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 `````````````````````````````````````````````````````` UL3Linux联盟 UL3Linux联盟 Private aa As PrintDataGrid.PrintDataGrid UL3Linux联盟 UL3Linux联盟 aa = New PrintDataGrid.PrintDataGrid(DataGrid1) UL3Linux联盟 UL3Linux联盟 aa.setPrintFont() = New System.Drawing.Font("宋体", 12) '打印文本的字体 UL3Linux联盟 aa.setPrintRecordNumber = 30 '每页要打印的记录行数 UL3Linux联盟 UL3Linux联盟 aa.Print() UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 UL3Linux联盟 功能:可以直接打印DATAGRID控件中的数据,但不能对数据进行格式化,功能还在完善中:) UL3Linux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论 |
|
|
|
|
|