首 页 | 新 闻 | 技术中心 | 第二书店 | 《程序员》 | 《开发高手》 | 社 区 | 黄 页 | 人 才
移 动专 题SUNIBM微 软微 创精 华Donews人 邮
我的技术中心 
我的分类 我的文档
全部文章 发表文章
专栏管理 使用说明



 RSS 订阅 
最新文档列表
Windows/.NET
.NET  (rss)    
Visual C++  (rss)    
Delphi  (rss)    
Visual Basic  (rss)    
ASP  (rss)    
JavaScript  (rss)    
Java/Linux
Java  (rss)    
Perl  (rss)    
综合
其他开发语言  (rss)    
文件格式  (rss)    
企业开发
游戏开发  (rss)    
网站制作技术  (rss)    
数据库
数据库开发  (rss)    
软件工程
其他  (rss)    

积极原创作者 
iiprogram (68)
qdzx2008 (50)
goodboy1881 (14)
wangchinaking (58)
fancyhf (1)
harrymeng (41)
yjz0065 (113)
coofucoo (105)
Drate (69)
lphpc (30)
CSDN - 文档中心 - .NET 阅读:9822   评论: 6    参与评论
标题   DataGrid控件通用打印类.     选择自 xiaochongsun 的 Blog
关键字   DataGrid
出处  


Imports System.Drawing.Printing
Imports System.Drawing.Color
Imports System.Windows.Forms
Imports System.Drawing.Font
Imports System.Drawing.PointF
Imports System.Windows.Forms.DataGrid
Imports System.Drawing.Pen
Imports System.Drawing

 

''=======================================
'DATAGRID控件通用打印类
'中和科技-孙利臣
'于2003年05月27日17:05
'用于打印DATAGRID控件中的数据.

'=======================================


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                    '当前要打印的数据与DATAGRID控件内数据的比例

    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                        '当前DATAGRID共有多少列

    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()
        DataGridTable = DataGridSource.DataSource()
        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
            'PrintDataTable.Print()

            '打印机设置对话框
            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 + 5)
            Else
                PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Width / (PrintFont.Height + 5)
            End If


            '如果用户选择自定义纸张大小打印,则按B5纸打印,不管实际纸张大小
            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)
        Finally

        End Try
    End Sub

    Private Sub PrintDataGrid_PrintPage(ByVal sender As Object, ByVal ev As System.Drawing.Printing.PrintPageEventArgs)

        'A4纸  A4 纸,210 x 297 毫米。
        'B5纸 B5 纸,182 x 257 毫米。

        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                                      '因为每打印一个新页都要计算还有多少页没有打印所以以打印的页数初始为0


        '将当前页分成基本的单元
        If PrintDataGrid.DefaultPageSettings.Landscape = True Then
            X_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Height / (DataGridTable.Columns.Count + 2)
            Y_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Width / PrintLines

        Else
            X_unit = PrintDataGrid.DefaultPageSettings.PaperSize.Width / (DataGridTable.Columns.Count + 2)
            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)
            '文档标题----------------打印结束

            '得到DATAGRID的所有列名
            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)                                   '画线
            '结束---------------------得到DATAGRID的所有列名


            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 <> "" Then                 'And strNonce <> ""
                            If strUpData <> DataGridRow(ColumnText(0)) Then
                                ev.HasMorePages = True
                                Exit Sub

                            End If
                        End If
                    End If

                    ev.Graphics.DrawString(DataGridRow(ColumnText(Cols)), PrintFont, DrawBrush, DrawPoint)
                    strUpData = DataGridRow(ColumnText(0))                              '当前行数据打印完成后,将打记录的第一列保存,(也可不用此语句,只为明确)
                Next

                DrawPoint.X = X_unit * 1
                DrawPoint.Y = Y_unit * (PrintingLine + 1 + 2)

                Call DrawLine(DrawPoint, ev)

                PrintingLine += 1
                PrintRecordComplete += 1

                '打印完最后一条记录后结束打印.
                '如:当前有500条记录.从0开始打印,实际打印的为第一条记录.则打印500条时实际的是第501条记录.也就是最后一条
                'datagridtable.rows.count得到就是表内的实际记录条数,共有多少条记录(从1开始),当
                'printrecordcomplete>=datagridtable.rows.count也就是当前已经打印到了500条,加1后将要打印第501条,越界,则结束.
                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

 

 

``````````````````````````````````````````````````````

    Private aa As PrintDataGrid.PrintDataGrid

        aa = New PrintDataGrid.PrintDataGrid(DataGrid1)

       aa.setPrintFont() = New System.Drawing.Font("宋体", 12)          '打印文本的字体
        aa.setPrintRecordNumber = 30                                      '每页要打印的记录行数

        aa.Print()

 

功能:可以直接打印DATAGRID控件中的数据,但不能对数据进行格式化,功能还在完善中:)

希望大家多多指教.谢谢.

 


相关文章
对该文的评论
MISGoldPrinter ( 2005-08-26)
www.webmis.com.cn
下载.net源码打印程序,Exel访问列方便
flygoldfish ( 2005-01-07)
C#开源打印源码
http://community.csdn.net/Expert/topic/3278/3278050.xml?temp=.5012934
CSDN 网友 ( 2004-09-06)
确实有一页只打一条记录的现象,请核实并修改
xmzhy ( 2003-12-17)
xiaochongsun(原作) :
   看了你的代码,依然不能解决问题,能否提供原代码吗?ustczhy@yeah.net。
xiaochongsun ( 2003-06-02)
是的,这段代码,是根据自己的需要编写的,所以里面可能做的不是很通用.以后有空会加以改进的.

webq说的问题,我也没测,当时需要是根据第一例的数据进行分页打印.如果第一例的数据变了,则另起一页.

你看一下是不是因为这个