📄 datagridprinter.vb
字号:
Imports System.Drawing.Printing
Imports System.Drawing
Imports System.Security.Principal
Imports System.Reflection
#Region "DataGridPrinter"
'\\ --[DataGridPrinter]----------------------------------------------
'\\ Provides a way to print a nicely formatted page from a data grid
'\\ control.
'\\ -----------------------------------------------------------------
Public Class DataGridPrinter
#Region "Private enumerated types"
Public Enum CellTextHorizontalAlignment
LeftAlign = 1
CentreAlign = 2
RightAlign = 3
End Enum
Public Enum CellTextVerticalAlignment
TopAlign = 1
MiddleAlign = 2
BottomAlign = 3
End Enum
#End Region
#Region "Private properties"
'\\ Printing the report related
Private WithEvents _GridPrintDocument As PrintDocument
Private _DataGrid As DataGrid
'\\ Print progress variables
Private _CurrentPrintGridLine As Integer
Private _CurrentPageDown As Integer
Private _CurrentPageAcross As Integer = 1
'\\ Fonts to use to do the printing...
Private _PrintFont As New Font(System.Drawing.FontFamily.GenericSansSerif, 9)
Private _HeaderFont As New Font(System.Drawing.FontFamily.GenericSansSerif, 12)
Private _FooterFont As New Font(System.Drawing.FontFamily.GenericSansSerif, 10)
Private _HeaderRectangle As Rectangle
Private _FooterRectangle As Rectangle
Private _PageContentRectangle As Rectangle
Private _Rowheight As Double
'\\ Column widths related
Private _PagesAcross As Integer = 1
Private _ColumnBounds As New ColumnBounds
Private _Textlayout As System.Drawing.StringFormat
Private _FooterHeightPercent As Integer = 3
Private _HeaderHeightPercent As Integer = 7
Private _InterSectionSpacingPercent As Integer = 2
Private _CellGutter As Integer = 5
'\\ Pens to draw the sections with
Private _FooterPen As New Pen(Color.Green)
Private _HeaderPen As New Pen(Color.RoyalBlue)
Private _GridPen As New Pen(Color.Black)
'\\ Brushes to fill the sections with
Private _HeaderBrush As Brush = Brushes.White
Private _FooterBrush As Brush = Brushes.White
Private _ColumnHeaderBrush As Brush = Brushes.White
Private _OddRowBrush As Brush = Brushes.White
Private _EvenRowBrush As Brush = Brushes.White
Private _HeaderText As String
Private _LoggedInUsername As String
Private _GridRowCount As Integer
Private _GridColumnCount As Integer
#End Region
#Region "Public interface"
#Region "Properties"
#Region "PagesAcross"
Public Property PagesAcross() As Integer
Get
Return _PagesAcross
End Get
Set(ByVal Value As Integer)
If Value < 1 Then
Throw New ArgumentOutOfRangeException("PagesAcross", "Must be one or more pages across")
End If
_PagesAcross = Value
End Set
End Property
#End Region
#Region "FooterHeightPercent"
Public Property FooterHeightPercent() As Integer
Get
Return _FooterHeightPercent
End Get
Set(ByVal Value As Integer)
If Value < 0 OrElse Value >= 30 Then
Throw New ArgumentException("FooterHeightPercent must be between 0 and 30")
End If
_FooterHeightPercent = Value
End Set
End Property
#End Region
#Region "HeaderHeightPercent"
Public Property HeaderHeightPercent() As Integer
Get
Return _HeaderHeightPercent
End Get
Set(ByVal Value As Integer)
If Value < 0 OrElse Value >= 30 Then
Throw New ArgumentException("HeaderHeightPercent must be between 0 and 30")
End If
_HeaderHeightPercent = Value
End Set
End Property
#End Region
#Region "InterSectionSpacingPercent"
Public Property InterSectionSpacingPercent() As Integer
Get
Return _InterSectionSpacingPercent
End Get
Set(ByVal Value As Integer)
If Value < 0 OrElse Value >= 20 Then
Throw New ArgumentException("InterSectionSpacingPercent must be between 0 and 20")
End If
_InterSectionSpacingPercent = Value
End Set
End Property
#End Region
#Region "CellGutter"
Public Property CellGutter() As Integer
Get
Return _CellGutter
End Get
Set(ByVal Value As Integer)
If Value < 0 OrElse Value >= 10 Then
Throw New ArgumentException("CellGutter must be between 0 and 10")
End If
_CellGutter = Value
End Set
End Property
#End Region
#Region "HeaderFont"
Public Property HeaderFont() As Font
Get
Return _HeaderFont
End Get
Set(ByVal Value As Font)
'\\ Possible font size validation here..
_HeaderFont = Value
End Set
End Property
#End Region
#Region "PrintFont"
Public Property PrintFont() As Font
Get
Return _PrintFont
End Get
Set(ByVal Value As Font)
'\\ Possible font size validation here
_PrintFont = Value
End Set
End Property
#End Region
#Region "FooterFont"
Public Property FooterFont() As Font
Get
Return _FooterFont
End Get
Set(ByVal Value As Font)
'\\ Possible font size validation here
_FooterFont = Value
End Set
End Property
#End Region
#Region "HeaderText"
Public Property HeaderText() As String
Get
Return _HeaderText
End Get
Set(ByVal Value As String)
_HeaderText = Value
End Set
End Property
#End Region
#Region "HeaderPen"
Public Property HeaderPen() As Pen
Get
Return _HeaderPen
End Get
Set(ByVal Value As Pen)
_HeaderPen = Value
End Set
End Property
#End Region
#Region "FooterPen"
Public Property FooterPen() As Pen
Get
Return _FooterPen
End Get
Set(ByVal Value As Pen)
_FooterPen = Value
End Set
End Property
#End Region
#Region "GridPen"
Public Property GridPen() As Pen
Get
Return _GridPen
End Get
Set(ByVal Value As Pen)
_GridPen = Value
End Set
End Property
#End Region
#Region "HeaderBrush"
Public Property HeaderBrush() As Brush
Get
Return _HeaderBrush
End Get
Set(ByVal Value As Brush)
_HeaderBrush = Value
End Set
End Property
#End Region
#Region "FooterBrush"
Public Property FooterBrush() As Brush
Get
Return _FooterBrush
End Get
Set(ByVal Value As Brush)
_FooterBrush = Value
End Set
End Property
#End Region
#Region "ColumnHeaderBrush"
Public Property ColumnHeaderBrush() As Brush
Get
Return _ColumnHeaderBrush
End Get
Set(ByVal Value As Brush)
_ColumnHeaderBrush = Value
End Set
End Property
#End Region
#Region "OddRowBrush"
Public Property OddRowBrush() As Brush
Get
Return _OddRowBrush
End Get
Set(ByVal Value As Brush)
_OddRowBrush = Value
End Set
End Property
#End Region
#Region "EvenRowBrush"
Public Property EvenRowBrush() As Brush
Get
Return _EvenRowBrush
End Get
Set(ByVal Value As Brush)
_EvenRowBrush = Value
End Set
End Property
#End Region
#Region "PrintDocument"
Public ReadOnly Property PrintDocument() As PrintDocument
Get
Return _GridPrintDocument
End Get
End Property
#End Region
#Region "DataGrid"
Public WriteOnly Property DataGrid() As DataGrid
Set(ByVal Value As DataGrid)
_DataGrid = Value
End Set
End Property
#End Region
#End Region
#Region "Methods"
#Region "Shared methods"
'\\ --[StripDomainFromFullUsername]------------------------------------------------
'\\ Returns just the username bit from a username that includes a domain name
'\\ e.g. "DEVELOPMENT\Duncan" -> "Duncan"
'\\ (c) 2005 - Merrion Computing Ltd
'\\ -------------------------------------------------------------------------------
Public Shared Function StripDomainFromFullUsername(ByVal FullUsername As String) As String
If FullUsername.IndexOf("\") = -1 Then
Return FullUsername
Else
Dim sep() As Char = {Char.Parse("\")}
Dim chaf() As String = FullUsername.Split(sep)
Return (chaf(chaf.Length - 1))
End If
End Function
#End Region
#Region "Print"
Public Sub Print()
_GridPrintDocument.Print()
End Sub
#End Region
#End Region
#End Region
#Region "_GridPrintDocument events"
Private Sub _GridPrintDocument_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles _GridPrintDocument.BeginPrint
'\\ Initialise the current page and current grid line variables
_CurrentPrintGridLine = 1
_CurrentPageDown = 1
_CurrentPageAcross = 1
If _Textlayout Is Nothing Then
_Textlayout = New System.Drawing.StringFormat
_Textlayout.Trimming = StringTrimming.EllipsisCharacter
End If
End Sub
Private Sub _GridPrintDocument_PrintPage(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles _GridPrintDocument.PrintPage
If _CurrentPageDown = 1 And _CurrentPageAcross = 1 Then
' _HeaderRectangle - The top 10% of the page
_HeaderRectangle = e.MarginBounds
_HeaderRectangle.Height = CInt(e.MarginBounds.Height * _HeaderHeightPercent * 0.01)
' _FooterRectangle - the bottom 10% of the page
_FooterRectangle = e.MarginBounds
_FooterRectangle.Height = CInt(e.MarginBounds.Height * _FooterHeightPercent * 0.01)
_FooterRectangle.Y += CInt(e.MarginBounds.Height * (1 - (0.01 * _FooterHeightPercent)))
' _PageContentRectangle - The middle 80% of the page
_PageContentRectangle = e.MarginBounds
_PageContentRectangle.Y += CInt(_HeaderRectangle.Height + e.MarginBounds.Height * (_InterSectionSpacingPercent * 0.01))
_PageContentRectangle.Height = CInt(e.MarginBounds.Height * 0.8)
_Rowheight = e.Graphics.MeasureString("a", _PrintFont).Height
'\\ Create the _ColumnBounds array
Dim nColumn As Integer
Dim TotalWidth As Double
If _DataGrid.DataSource Is Nothing Then
'\\ Nothing in the grid to print
Exit Sub
End If
Dim ColumnCount As Integer = GridColumnCount()
For nColumn = 0 To ColumnCount - 1
Dim rcLastCell As Rectangle = _DataGrid.GetCellBounds(0, nColumn)
If rcLastCell.Width > 0 Then
TotalWidth += rcLastCell.Width
End If
Next
Dim TotalWidthOfAllPages As Integer = (e.MarginBounds.Width * PagesAcross)
_ColumnBounds.Clear()
For nColumn = 0 To ColumnCount - 1
'\\ Calculate the column start point
Dim NextColumn As New ColumnBound
If nColumn = 0 Then
NextColumn.Left = e.MarginBounds.Left
Else
NextColumn.Left = _ColumnBounds.RightExtents
End If
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -