DataGrid控件通用打印类.

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>


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控件中的数据,但不能对数据进行格式化,功能还在完善中:)

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

 

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
注意:本3.0版控件过于老旧,该控件最新版本为4.7版,您可以到http://myyouping.download.csdn.net/免费下载,也是完全免费的,没有任何功能及使用时间限制,0积分下载。我将3.0版控件的下载分提为10分,是希望大家使用最新版的控件控件特色: 1、超强大的DataGridView打印功能,不光可以以多种形式(普通打印、分栏打印、跨页打印、工资条打印打印DataGridView表格,基本上能完全按DataGridView控件本身设置的格式如字体、字号、背景颜色、前景颜色、单元格对齐方式等打印出来,文字图像都可以打印,而且是完全根据表格当前的显示顺序进行打印的,如果您在使用时调整了列的顺序,刷新打印后就会按调整后的列显示顺序进行打印(这是网上很多DataGridView打印控件没有实现的),基本上做到了所见即所得的打印。 2、强大的文本打印输出功能,打印文本时,如果需要,控件会自动换行或换页打印输出。 3、支持同一文档多种版面格式打印似于Word中的节的功能):对同一份文档,不同的页面可以设置不同的格式(纸张大小、纸张方向、页边距),只需要在新增一页时在NewPage方法中指定要使用的页面格式即可,使用非常简单。 4、报表功能。本控件允许将当前打印预览的内容保存为报表文件,以后使用本控件重新打开该报表文件即可重现原来保存报表时的打印内容。 5、打印方案保存与读取功能。可以将当前打印参数保存为打印方案文件,或都从保存的打印方案文件中读取打印参数。 6、水印功能。根据需要,可以在页面中打印或不打印以半透明空心文字打印水印。 7、特殊文字效果功能。本版控件具有打印浮雕文字、阴影文字、空心文字、块文字的功能,效果非常不错。 8、页眉页脚中既可打印文字,也可打印图像,或者即打印图像又打印输出文字。 9、图像打印输出功能。 本控件包括两个打印组件:DGVprint打印组件与VB2008print打印组件。VB2008Print为通用打印控件(为可视化组件),可以混合打印一个或多个DataGridView表格、DataGrid表格与文字、图片等内容;而DGVprint是以VB2008Print为基础开发的(为非可视化组件),为专用的表格打印控件,可以很方便打印单个DatatGridview、DataGrid、DataTable表格的内容,并提供打印时的可视化设置界面,可设置表格打印方式(普通打印、分栏打印、跨页打印、工资条打印)、标题内容及字体、页眉页脚、选择要打印的表格列、列顺序调整及列格式设置、更改列标题名称等,使用非常方便,功能非常强大。 与本控件的上一个版本2.1版相比,本版控件新增功能如下: VB2008Print打印组件新增功能: 1、多种特效文字打印输出功能,能打印的特效文字有 空心文字、浮雕文字、块文字、阴影文字等。 2、水印打印功能。可以在面页中以半透明空心文字的形式打印背景水印,只需要简单设置控件的WaterMarkText等几个以WaterMark开头的属性即可,程序会自动打印水印。 3、PrintDGV函数可直接使用DGVPrint组件保存的打印方案文件打印输出DataGridView表格, 4、在页眉页脚中不光可以打印文本,还可以打印图像,文本与图像可同时打印(即在图像上显示文本)。此外,页眉页脚文字可以换行打印了,页面的左边也右边距也可以打印内容了(调用相应的函数PrintLeft与PrintRight实现)。 5、改进DrawText函数输出文本的功能,现在,即便调用没有指定打印区域或打印宽度的DrawText函数输出文本,打印输出时控件也会智能换行和换页(原版本是需要指定打印宽度才能自动换行换页打印的) 6、改进DrawImage与DrawCellImage输出图像功能,如果图像比较小(小于打印区域大小),可以不进行放大打印。(但如果图像大于打印区域的话,还是采用整体缩小打印,而不是区域剪裁打印)。 7、增加IsShowPrintStatusDialog属性,指示在发送到打印打印时,是否显示一个指示正在打印的状态窗口(可以取消打印),为TRUE表示要显示,为False表示不显示。 8、改进页眉页脚事件,将原来的HeaderOut与FooterOut统一为HeaderFooterOut事件,在该事件中,您可以调用PrintFooter、PrintHeader、PrintLeft、PrintRight函数分别打印上下左右的页眉。(PrintLeft与PrintRight函数为新增加的,用于在左边与右边页边距处输出内容) DGVPrint打印组件新增功能: 1、打印方案保存与读取功能。本版控件可以将您的可视化设置(包括列格式设置等)全部保存为打印方案文件(文本文件,您可以用记事本打开并修改),并有读取方案文件的功能,不再需要每次都进行打印格式设置了,一劳永逸! 2、直接调用打印方案文件打印功能。您不光可以设计DGVPrint打印组件的属性来进行打印,还可以直接调用DGVPrint组件中保存的打印方案文件,直接利用保存的方案文件的参数进行打印预览输出。 3、新增在可视化打印参数设置界面的列标题重命名功能,可能修改列标题要打印的名字。 4、水印打印功能。如果水印文本设置为空,则不打印水印。 5、导出数据成Excel功能。暂未提供该功能的函数接口,只在打印参数设置窗口中增加了一个数据导出的按钮,可以将当前要打印DataGridView的内容导出成Excel文件。该功能以后会进一步完善。 6、在进行页眉页脚文本设置时,可以用 [页码] 代表要输出的当前页码,用 [总页数] 代表要输出总页数,控件在进行输出时,会自动将其转换为对应的页码与文档总页数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值