在网上找到一个.net的打印类,打印Dataset的,不错,保存于止

''======================================= 
'DATAGRID控件通用打印类 
'中和科技-孙利臣 
'于2003年05月27日17:05 
'用于打印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

Public Class PrintClass Print
    '用户可自定义 
    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 PrintPageEventArgs
    Private PrintDocument1 As PrintDocument
    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 '总共应该打印的页数 

    Sub New()Sub New(ByVal TableSource As DataTable)
        DataTable1 = New DataTable
        DataTable1 = TableSource
        ColsCount = DataTable1.Columns.Count
    End Sub

    '用户自定义字体及字号 
    Public WriteOnly Property SetTableFont()Property SetTableFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            TableFont = Value
        End Set
    End Property
    Public WriteOnly Property SetHeadFont()Property SetHeadFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            HeadFont = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadFont()Property SetSubHeadFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            SubHeadFont = Value
        End Set
    End Property
    Public WriteOnly Property SetFootFont()Property SetFootFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            FootFont = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootFont()Property SetSubFootFont() As System.Drawing.Font
        Set(ByVal Value As System.Drawing.Font)
            SubFootFont = Value
        End Set
    End Property
    Public WriteOnly Property SetHeadText()Property SetHeadText() As String
        Set(ByVal Value As String)
            HeadText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadLeftText()Property SetSubHeadLeftText() As String
        Set(ByVal Value As String)
            SubHeadLeftText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadRightText()Property SetSubHeadRightText() As String
        Set(ByVal Value As String)
            SubHeadRightText = Value
        End Set
    End Property
    Public WriteOnly Property SetFootText()Property SetFootText() As String
        Set(ByVal Value As String)
            FootText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootLeftText()Property SetSubFootLeftText() As String
        Set(ByVal Value As String)
            SubFootLeftText = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootRightText()Property SetSubFootRightText() As String
        Set(ByVal Value As String)
            SubfootRightText = Value
        End Set
    End Property
    Public WriteOnly Property SetHeadHeight()Property SetHeadHeight() As Integer
        Set(ByVal Value As Integer)
            HeadHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetSubHeadHeight()Property SetSubHeadHeight() As Integer
        Set(ByVal Value As Integer)
            SubHeadHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetFootHeight()Property SetFootHeight() As Integer
        Set(ByVal Value As Integer)
            FootHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetSubFootHeight()Property SetSubFootHeight() As Integer
        Set(ByVal Value As Integer)
            SubFootHeight = Value
        End Set
    End Property
    Public WriteOnly Property SetCellHeight()Property SetCellHeight() As Integer
        Set(ByVal Value As Integer)
            Y_unit = Value
        End Set
    End Property

    Public Sub Print()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() = 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()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

End Class

时间: 2024-08-01 05:21:16

在网上找到一个.net的打印类,打印Dataset的,不错,保存于止的相关文章

jni findclass-jni FindClass怎么找到一个实现接口的类?

问题描述 jni FindClass怎么找到一个实现接口的类? 比如public class B implements A,A是一个自己写的接口,B是实现这个接口的类,我通过FindClass找不到B啊,怎么办啊?

终于找到一个比较好的web打印方案了

问题描述 前段时间一直在研究web打印,刚开始使用js的WebBrowser控件来实现,花了2天时间,研究的差不多了,回来发现打印的时候总是会提示选择打印机的框,查询N次百度和google,最终木有找到解决方案.后来无意间发现PAZU,PAZU很好的解决了这个问题,还有PAZU的方法非常直观.全面,比WebBrowser好用多了,Pazu的具体介绍和方法,请查看http://www.4fang.net/apps/D4/Default.aspx?tid=4221&pn=4221&nodeid

ASP.NET网页打印(只打印相关内容/自写功能)_实用技巧

昨晚朋友要求在前段时间完成的新闻的网站上加上一个功能,就是在每篇新闻浏览的页面, 加一个打印铵钮.让用户一点打印,能把整篇文章打印.一开始建议朋友,叫用户使用IE浏览器的打印功能,但是朋友说,那个打印功能是把页面的不相关的内容也打印了,用户只想打印整篇文章即可. 既然要改,照做就是了.没有这方面经验,在网上找到很多相关的ASP.NET打印例子,要么太过复杂,要么效果不太理想.最后还是结合这诸多的例子,改写一个合适的功能. 下面是改写的地方,首先在文章浏览的.aspx页面,添加一个Div,并加上r

gdb找到一个地址对应的标志符或者符号

问题描述 gdb找到一个地址对应的标志符或者符号 我想把一个地址转化为其对应的符号.在gdb下,可以打印出符号的值和地址值,那如果我目前查看反汇编代码时,得到了一个地址值是0xb7129678,那么怎么反过来得到这个地址对应的是CapListCount这个符号呢?谢谢. 我发现几个命令是无效的.或者说我没有正确使用这几个命令 解决方案 可以查看到符号表中的地址转换,堆栈上的无法由地址转换过来 解决方案二: 使用examine命令(简写是x)来查看内存地址中的值.x命令的语法如下所示: x/ 具体

javascript-Javascript,一个通用的实现类继承的函数

问题描述 Javascript,一个通用的实现类继承的函数 var A = function() { this.a = 3; } var B = function() { this.b = 6; } function ext(A, B) { var subclass = B; //構造一個新的同名類類,用他來繼承父類,並且調用子類都構造函數 var B = function() { A.apply(this.arguments); subclass.apply(this.arguments);

代码-网上找到的示例程序如何导入Android Studio并正常运行

问题描述 网上找到的示例程序如何导入Android Studio并正常运行 因为网站上只给了很少一部分信息,加上对android studio的gradle不太熟悉,所以不知道如何运行 比如说下面这个网站上的代码,我如何正确导入android studio并运行.http://apkdemo.com/glassview.html 解决方案 我平时使用Eclipse开发,遇到你说的情况,一般是下载示例程序,新建一个Android工程,将示例程序中的src.res.lib.AndroidManife

这种情况如何解耦?,比如类A有一个变量数组,里面是C类的实现,但C类有一个变量是A类的实例。

问题描述 这种情况如何解耦?,比如类A有一个变量数组,里面是C类的实现,但C类有一个变量是A类的实例.举例.ClassA{C[]children=...........publicvoidLoadC(){children[index]=newC(this);}}classC{C(Aparent){this.parent=parent;}} 大概就是这个样子的.请问这样做是不是很不好?有何办法解决?标题有错字,实例不是现实,csdn这么多年了还是不能编辑标题与内容,真是操蛋. 解决方案 本帖最后由

无线网络连不上只显示找到一个无线宽带连接

现在无线网络比较普及了,笔记本大多也带无线功能,电脑屏幕上显示找到一个无线宽带连接,但无线网络连不上,这种事屡见不鲜,无线网络连不上是怎么回事呢? 问题1 忘记打开浏览器.一些需要付费使用的无线宽带连接必须先打开你的浏览器,如InternetExplorer.Safari或Firefox,有些免费的无线网络也会要求你先打开浏览器.打开浏览器后,你会看到无线宽带连接的网页.在这里你便要输入你的信用卡号或登入你已经存在的帐号. 问题2 没有连上网页.要连上无线网络,你必须要连上特定网页.然而有些人将

java-为什么不可能创建一个继承OnTouchListener的类?

问题描述 为什么不可能创建一个继承OnTouchListener的类? Android SDK在TouchEvent有一个接口(android.view.View.OnTouchListener).我不知道为什么下面这一行是错误的.Eclipse在OnTouchListener报错. public class TouchHandler extends OnTouchListener{ 如果我改为public interface TouchHandler extends OnTouchListen