本单位所需水电管理,学习水晶报表太累,不大懂,又难部署
通过控件在窗体的布局,实现模拟打印
如图:
'打印datagridview内容单元格
Public Sub PrintDataGridDetail(ByVal loc As Point, ByRef e As System.Drawing.Printing.PrintPageEventArgs, ByVal dg As DataGridView, Optional ByVal bnFormat As Boolean = False)
Dim irow As Integer : Dim icol As Integer '+ New Point(0, datagrid.ColumnHeadersHeight)
Dim strValue As String = ""
Dim rect As New Rectangle
Dim dgDetailX As Integer : Dim dgDetailY As Integer
dgDetailX = Loc.X : dgDetailY = Loc.Y
Dim StrFormat As New StringFormat
With StrFormat
.LineAlignment = StringAlignment.Center
.Alignment = StringAlignment.Center
.Trimming = StringTrimming.None
End With
'全部打印,打印datagrid指定行数的表格
If bnFormat = False Then
Dim tmpwidth As Integer
For i As Integer = 0 To ModVia.rowsNumberPerPage - 1
For j As Integer = 0 To dg.Columns.Count - 1
Dim rect1 As New Rectangle
rect1 = New Rectangle(dgDetailX, tmpwidth, dg.Columns(j).Width, dg.RowTemplate.Height)
rect1.Offset(0, dg.RowTemplate.Height * i)
tmpwidth += dg.Columns(j).Width
Next
Next
End If
'打印表格内容
'循环分页
Dim tmpStartRow As Integer : Dim tmpEndRow As Integer
tmpStartRow = (Me.iCurrenPageNo - 1) * ModVia.rowsNumberPerPage
tmpEndRow = tmpStartRow + ModVia.rowsNumberPerPage - 1
If tmpEndRow >= dg.Rows.Count - 1 Then tmpEndRow = dg.Rows.Count - 1
Dim offsetY As Integer
If Me.iCurrenPageNo = 1 Then
offsetY = 0
Else
offsetY = (Me.iCurrenPageNo - 1) * dg.RowTemplate.Height * ModVia.rowsNumberPerPage
End If
Dim ir As Integer = 0
For irow = tmpStartRow To tmpEndRow 'datagrid.Rows.Count - 1
Me.iCurrenRow = (Me.iCurrenPageNo - 1) * ModVia.rowsNumberPerPage + irow + 1
Dim colWidth As Integer = 0
For icol = 0 To dg.Columns.Count - 1
If dg.Rows(irow).Cells(icol).Value Is DBNull.Value Then
strValue = ""
Else
strValue = dg.Rows(irow).Cells(icol).FormattedValue
End If
'方法一
e.Graphics.DrawString(strValue, dg.Font, Brushes.Black, dgDetailX + colWidth, dgDetailY + ir * dg.RowTemplate.Height + dg.ColumnHeadersHeight + 3) '3为偏移量
colWidth += dg.Columns(icol).Width
'方法二
rect = dg.GetCellDisplayRectangle(icol, irow, False)
rect.Offset(dgDetailX + IIf(dg.RowHeadersVisible, 0, -2), dgDetailY - offsetY)
'e.Graphics.DrawString(strValue, dg.Font, Brushes.Black, rect)
'If Me.bnPrintFormat = False Then
' e.Graphics.DrawRectangle(Pens.Black, rect)
'End If
Next
'当前打印页面的行标
ir += 1
Next
'设置分页
Me.iCurrenPageNo += 1
If Me.iCurrenPageNo > Me.iTotalPageNo Then
e.HasMorePages = False
Me.iCurrenRow = 0
Else
e.HasMorePages = True
End If
End Sub
'打印普通控件
Public Sub PrintControl(ByVal loc As Point, ByVal e As System.Drawing.Printing.PrintPageEventArgs, ByVal cb As Control, Optional ByVal bnFormat As Boolean = False)
Dim rect As New Rectangle
Dim StrFormat As New StringFormat
With StrFormat
.LineAlignment = StringAlignment.Near
.Alignment = StringAlignment.Near
End With
For Each ob As Control In cb.Controls
rect = ob.Bounds
rect.Offset(e.MarginBounds.Left, e.MarginBounds.Top)
If TypeOf (ob) Is TextBox Then
e.Graphics.DrawString(ob.Text, ob.Font, Brushes.Black, rect, StrFormat)
ElseIf (TypeOf (ob) Is Label) Then
'MsgBox(ob.Text + vbCrLf + rect.ToString)
'非格式套打
If bnFormat = False Then
e.Graphics.DrawString(ob.Text, ob.Font, Brushes.Black, rect, StrFormat)
End If
End If
Next
'e.Graphics.DrawRectangle(Pens.DarkCyan, cb.Bounds)
End Sub
'打印TabPanel控件 ,表格下面采用tabpanel控件
Public Sub PrintTabPanel(ByVal loc As Point, ByVal e As System.Drawing.Printing.PrintPageEventArgs, ByVal tb As TableLayoutPanel, Optional ByVal bnFormat As Boolean = False)
'===表格以下部分起始Y坐标 额定 几行后 开始
Dim MsgX As Integer : Dim MsgY As Integer
Dim strFormat As New StringFormat
Dim rect As New Rectangle
MsgX = loc.X : MsgY = loc.Y
With strFormat
.Alignment = StringAlignment.Center
.LineAlignment = StringAlignment.Center
End With
'绘制容器内 控件字符串内容
Try
For Each ob1 As Control In Me.TableLayoutPanel1.Controls
rect = ob1.Bounds
rect.Offset(MsgX, MsgY)
If TypeOf (ob1) Is TextBox Then
'根据原有对齐方式进行打印
With strFormat
.Alignment = StringAlignment.Center
'.LineAlignment= '0左,2右 ,1 中 textAlign 左0,右1,中2
.LineAlignment = StringAlignment.Near ' Me.ChangeAlignMent(ob1)
End With
e.Graphics.DrawString(ob1.Text, ob1.Font, Brushes.Black, rect, strFormat)
ElseIf TypeOf (ob1) Is Label Then
If Me.bnPrintFormat = False Then
e.Graphics.DrawString(ob1.Text, ob1.Font, Brushes.Black, rect, strFormat)
End If
End If
Next
Catch ex As Exception
End Try
If bnPrintFormat = True Then Exit Sub
'绘制容器表格
Dim rstyle As New RowStyle : Dim cStyle As New ColumnStyle
Dim tempX As Integer : Dim tempY As Integer
Dim ia As Integer : Dim ja As Integer
Dim ob2 As New Control
tempX = MsgX
tempY = MsgY
Try
For ia = 0 To Me.TableLayoutPanel1.RowCount - 1
rstyle = Me.TableLayoutPanel1.RowStyles(ia)
'依次判断 列表
For ja = 0 To Me.TableLayoutPanel1.ColumnCount - 1
cStyle = Me.TableLayoutPanel1.ColumnStyles(ja)
ob2 = Me.TableLayoutPanel1.GetControlFromPosition(ja, ia)
If ob2 Is Nothing Then
tempX += cStyle.Width
Continue For
End If
Dim jaSpan As Integer = 1
jaSpan = Me.TableLayoutPanel1.GetColumnSpan(ob2)
'如有跨列的情况
If jaSpan <> 1 Then
Dim tmpTotalWidth As Integer = 0
For k As Integer = ja To ja + jaSpan - 1
tmpTotalWidth += Me.TableLayoutPanel1.ColumnStyles(k).Width
Next
rect = New Rectangle(tempX, tempY, tmpTotalWidth, rstyle.Height)
e.Graphics.DrawRectangle(Pens.Black, rect)
ja = ja + jaSpan - 1
tempX += tmpTotalWidth
Continue For
ElseIf jaSpan = 1 Then
rect = New Rectangle(tempX, tempY, cStyle.Width, rstyle.Height)
'rect.Offset(New Point(0, Me.GroupBox1.Top - Yoffset))
e.Graphics.DrawRectangle(Pens.Black, rect)
tempX += cStyle.Width
End If
Next
'x坐标复位,y坐标增加
tempX = MsgX
tempY += rstyle.Height
Next
Catch ex As Printing.InvalidPrinterException
MessageBox.Show(ex.Message, "测试", MessageBoxButtons.OK, MessageBoxIcon.Error)
Exit Sub
End Try
End Sub
我相信以上思路 会对大家有个帮助