DataGridView打印

   

Public Class dayreport1
    Inherits System.Windows.Forms.Form

    Private TableFont As New Font("宋体", 9)           '当前要打印文本的字体及字号
    Private HeadFont As New Font("黑体", 12, FontStyle.Underline) '表头字体
    Private SubHeadFont As New Font("楷体_GB2312", 10, FontStyle.Regular) '副表头字体
    Private HeadText As String   '表头文字
    Private SubHeadLeftText As String  '副表头左文字
    Private SubHeadRightText As String  '副表头右文字
    Private HeadHeight As Integer = 40 '表头高度
    Private SubHeadHeight As Integer = 30 '副表头高度
    Private FootFont As New Font("黑体", 12, FontStyle.Underline) '表脚字体
    Private SubFootFont As New Font("楷体_GB2312", 10, FontStyle.Regular) '副表脚字体
    Private FootText As String  '表脚文字
    Private SubFootLeftText As String  '副表脚左文字
    Private SubfootRightText As String
    Private FootHeight As Integer = 40 '表脚高度
    Private SubFootHeight As Integer = 30 '副表脚高度
    Dim X_unit As Integer                               '表的基本单位
    Dim Y_unit As Integer = TableFont.Height * 2.5

    '以下为模块内部使用
    Private ev As Printing.PrintPageEventArgs
    Private DataGridColumn As DataColumn
    Private DataGridRow As DataRow
    Private DataTable1 As DataTable
    Private Cols As Integer                             '当前要打印的列
    Private Rows As Integer = 0                         '当前要打印的行
    Private ColsCount As Integer                        '当前DATAGRID共有多少列
    Private PrintingLineNumber As Integer = 0           '当前正要打印的行号
    Private PageRecordNumber As Integer                 '当前要所要打印的记录行数,由计算得到.
    Private PrintingPageNumber As Integer = 0           '正要打印的页号
    Private PageNumber As Integer                       '共需要打印的页数
    Private PrintRecordLeave As Integer                 '当前还有多少页没有打印
    Private PrintRecordComplete As Integer = 0         '已经打印完的记录数
    Private Pleft As Integer
    Private Ptop As Integer
    Private Pright As Integer
    Private Pbottom As Integer
    Private Pwidth As Integer
    Private Pheigh As Integer

    Private DrawBrush As New SolidBrush(System.Drawing.Color.Black)     '当前画笔颜色
    Private PrintRecordNumber As Integer '每页打印的记录条数
    Private Totalpage As Integer '总共应该打印的页数
    '用户自定义字体及字号
    Public WriteOnly Property SetTableFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            TableFont = Value
        End Set
    End Property
    Public WriteOnly Property SetHeadFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            HeadFont = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            SubHeadFont = Value
        End Set
    End Property
    Public WriteOnly Property SetFootFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            FootFont = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            SubFootFont = Value
        End Set
    End Property
    Public WriteOnly Property SetHeadText() As String
        Set(ByVal Value As String)
            HeadText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadLeftText() As String
        Set(ByVal Value As String)
            SubHeadLeftText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadRightText() As String
        Set(ByVal Value As String)
            SubHeadRightText = Value
        End Set
    End Property
    Public WriteOnly Property SetFootText() As String
        Set(ByVal Value As String)
            FootText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootLeftText() As String
        Set(ByVal Value As String)
            SubFootLeftText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootRightText() As String
        Set(ByVal Value As String)
            SubfootRightText = Value
        End Set
    End Property
    Public WriteOnly Property SetHeadHeight() As Integer
        Set(ByVal Value As Integer)
            HeadHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadHeight() As Integer
        Set(ByVal Value As Integer)
            SubHeadHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetFootHeight() As Integer
        Set(ByVal Value As Integer)
            FootHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootHeight() As Integer
        Set(ByVal Value As Integer)
            SubFootHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetCellHeight() As Integer
        Set(ByVal Value As Integer)
            Y_unit = Value
        End Set
    End Property

    Public Sub Print()
        'Try
        PrintDocument1 = New Printing.PrintDocument
        AddHandler PrintDocument1.PrintPage, AddressOf Me.PrintDocument1_PrintPage

        Dim PageSetup As PageSetupDialog
        PageSetup = New PageSetupDialog
        PageSetup.Document = PrintDocument1
        PrintDocument1.DefaultPageSettings = PageSetup.PageSettings
        If PageSetup.ShowDialog() = Windows.Forms.DialogResult.Cancel Then
            Exit Sub
        End If

        Pleft = PrintDocument1.DefaultPageSettings.Margins.Left
        Ptop = PrintDocument1.DefaultPageSettings.Margins.Top
        Pright = PrintDocument1.DefaultPageSettings.Margins.Right
        Pbottom = PrintDocument1.DefaultPageSettings.Margins.Bottom
        Pwidth = PrintDocument1.DefaultPageSettings.Bounds.Width
        Pheigh = PrintDocument1.DefaultPageSettings.Bounds.Height

        '将当前页分成基本的单元
        X_unit = (Pwidth - Pleft - Pright) / DataTable1.Columns.Count - 1
        PrintRecordNumber = (Pheigh - Ptop - Pbottom - HeadHeight - SubHeadHeight - FootHeight - SubFootHeight - Y_unit) / Y_unit

        If DataTable1.Rows.Count > PrintRecordNumber Then
            If DataTable1.Rows.Count Mod PrintRecordNumber = 0 Then
                Totalpage = DataTable1.Rows.Count / PrintRecordNumber
            Else
                Totalpage = DataTable1.Rows.Count / PrintRecordNumber + 1
            End If
        Else
            Totalpage = 1
        End If

        PrintDocument1.DocumentName = Totalpage.ToString
        Dim PrintPriview As PrintPreviewDialog
        PrintPriview = New PrintPreviewDialog
        PrintPriview.Document = PrintDocument1
        PrintPriview.WindowState = FormWindowState.Maximized
        PrintPriview.ShowDialog()
        'Catch ex As Exception
        '    MsgBox("打印错误,请检查打印设置!", 16, "错误")
        'End Try
    End Sub

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

        'Dim row_count As Integer '当前要打印的行

        PrintRecordLeave = DataTable1.Rows.Count - PrintRecordComplete '还有多少条记录没有打印
        If PrintRecordLeave > 0 Then
            If PrintRecordLeave Mod PrintRecordNumber = 0 Then
                PageNumber = PrintRecordLeave / PrintRecordNumber
            Else
                PageNumber = PrintRecordLeave / PrintRecordNumber + 1
            End If
        Else
            PageNumber = 0
        End If

        '正在打印的页数
        PrintingPageNumber = 0       '因为每打印一个新页都要计算还有多少页没有打印所以以打印的页数初始为0
        '计算,余下的记录条数是否还可以在一页打印,不满一页时为假
        If DataTable1.Rows.Count - PrintingPageNumber * PrintRecordNumber >= PrintRecordNumber Then
            PageRecordNumber = PrintRecordNumber
        Else
            PageRecordNumber = (DataTable1.Rows.Count - PrintingPageNumber * PrintRecordNumber) Mod PrintRecordNumber
        End If

        Dim fmt As New StringFormat
        fmt.LineAlignment = StringAlignment.Center '上下对齐
        fmt.FormatFlags = StringFormatFlags.LineLimit '自动换行

        Dim Rect As New Rectangle '打印区域
        Dim Pen As New Pen(Brushes.Black, 1) '打印表格线格式

        While PrintingPageNumber <= PageNumber
            fmt.Alignment = StringAlignment.Center '表头中间对齐
            Rect.Width = Pwidth - Pleft - Pright '表头和副表头宽度等于设置区域宽度
            Rect.Height = HeadHeight
            Rect.X = Pleft
            Rect.Y = Ptop
            ev.Graphics.DrawString(HeadText, HeadFont, Brushes.Black, RectangleF.op_Implicit(Rect), fmt) '打印表头

            fmt.Alignment = StringAlignment.Near  '副表头左对齐
            Rect.Width = (Pwidth - Pleft - Pright) / 2 - 1
            Rect.Height = SubHeadHeight
            Rect.Y = Ptop + HeadHeight
            ev.Graphics.DrawString(SubHeadLeftText, SubHeadFont, Brushes.Black, RectangleF.op_Implicit(Rect), fmt) '打印副表头左

            fmt.FormatFlags = StringFormatFlags.DirectionRightToLeft '右副表头文字从右往左排列
            fmt.Alignment = StringAlignment.Near    '右副表头右对齐
            Rect.X = Pleft + (Pwidth - Pleft - Pright) / 2
            ev.Graphics.DrawString(SubHeadRightText, SubHeadFont, Brushes.Black, RectangleF.op_Implicit(Rect), fmt) '打印副表头右

            fmt.Alignment = StringAlignment.Center
            Rect.X = Pleft
            Rect.Y = Ptop + HeadHeight + SubHeadHeight + (PrintRecordNumber + 1) * (Y_unit) + SubFootHeight
            Rect.Height = FootHeight
            Rect.Width = Pwidth - Pleft - Pright
            ev.Graphics.DrawString(FootText, FootFont, Brushes.Black, RectangleF.op_Implicit(Rect), fmt)   '打印表脚

            fmt.Alignment = StringAlignment.Far   '副表左左对齐
            Rect.X = Pleft
            Rect.Y = Ptop + HeadHeight + SubHeadHeight + (PrintRecordNumber + 1) * (Y_unit)
            Rect.Height = SubFootHeight
            Rect.Width = (Pwidth - Pleft - Pright) / 2 - 1
            ev.Graphics.DrawString(SubFootLeftText, SubFootFont, Brushes.Black, RectangleF.op_Implicit(Rect), fmt) '打印左表脚

            fmt.Alignment = StringAlignment.Near   '副表头右对齐
            Rect.X = Pleft + (Pwidth - Pleft - Pright) / 2
            If DataTable1.Rows.Count = 0 Then
                SubfootRightText = "第" & Totalpage & "页,共" & Totalpage & "页"
            Else
                SubfootRightText = "第" & Totalpage - PageNumber + 1 & "页,共" & Totalpage & "页"
            End If
            ev.Graphics.DrawString(SubfootRightText, SubFootFont, Brushes.Black, RectangleF.op_Implicit(Rect), fmt) '打印右表脚

            '得到datatable的所有列名
            fmt.Alignment = StringAlignment.Center
            Dim ColumnText(DataTable1.Columns.Count) As String
            'Dim Table As Integer
            For Cols = 0 To DataTable1.Columns.Count - 1
                ColumnText(Cols) = DataTable1.Columns(Cols).ToString         '得到当前所有的列名
                Rect.X = Pleft + X_unit * Cols
                Rect.Y = Ptop + HeadHeight + SubHeadHeight
                Rect.Width = X_unit
                Rect.Height = Y_unit
                ev.Graphics.DrawString(ColumnText(Cols), New Font(TableFont, FontStyle.Bold), DrawBrush, RectangleF.op_Implicit(Rect), fmt)
                ev.Graphics.DrawRectangle(Pen, Rect)
            Next
            '结束---------------------得到datatable的所有列名
            Dim PrintingLine As Integer = 0                         '当前页面已经打印的记录行数
            While PrintingLine < PageRecordNumber
                DataGridRow = DataTable1.Rows(PrintRecordComplete)        '确定要当前要打印的记录的行号
                For Cols = 0 To DataTable1.Columns.Count - 1
                    Rect.X = Pleft + X_unit * Cols
                    Rect.Y = Ptop + HeadHeight + SubHeadHeight + (PrintingLine + 1) * (Y_unit)
                    Rect.Width = X_unit
                    Rect.Height = Y_unit
                    If DataGridRow(ColumnText(Cols)) Is System.DBNull.Value = False Then
                        ev.Graphics.DrawString(DataGridRow(ColumnText(Cols)), TableFont, DrawBrush, RectangleF.op_Implicit(Rect), fmt)
                    End If
                    ev.Graphics.DrawRectangle(Pen, Rect)
                Next
                PrintingLine += 1
                PrintRecordComplete += 1
                If PrintRecordComplete >= DataTable1.Rows.Count Then
                    ev.HasMorePages = False
                    PrintRecordComplete = 0
                    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

    ''' <summary>
    ''' '''''''''''''''''''''以上为打印代码
    ''' </summary>
    ''' <remarks></remarks>
    '''

    Private sqlconn As String = "......."   '''''''用的SQLServer自己写了
    Private conn As New SqlClient.SqlConnection(sqlconn)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Dim s = queryqll()
    End Sub
    Public Function queryqll() As String
        conn = New SqlClient.SqlConnection(sqlconn)
       Dim CommandText = "select * from tablename "  ''''查询一个表吧

       Dim myCommand As New SqlClient.SqlDataAdapter(CommandText, conn)

        Dim ds As New DataSet()
        myCommand.Fill(ds, "T1")

        DataGrid1.DataSource = ds.Tables("T1")
        DataGrid1.ReadOnly = True   ''''datagridview 让他只读
       

        Return 1
    End Function

    Private Sub dayreport_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        Dim s = queryqll()
    End Sub

    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click

'''''这是触发的打印按钮

        DataTable1 = DataGrid1.DataSource
        HeadText = "表头不能只有身体啊!"
        Call Print()

     '''''别忘了 拉个 printdocument 下来
    End Sub

End Class 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 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
发出的红包

打赏作者

灵雨飘零

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值