teger
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
'*
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)
'*
Dim ColumnText(DataGridTable.Columns.Count) As String
Dim Cols As Integer
'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)
'*
Dim printingline As Integer = 0
'*
Dim strNonce As String = ""
Dim strUpData 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 <> "" And strNonce <> "" Then
If strUpData <> DataGridRow(ColumnText(0)) Then
ev.HasMorePages = True
Exit Sub
End If
End If
End If
ev.Graphics.DrawString(Convert.ToString(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
'*
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
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 Sub btnPrint_Click(sender As Object, e As EventArgs) Handles btnPrint.Click
If dgvWindWorkLog.DataSource Is Nothing Then
MsgBox("没有可打印的内容,请重新操作!", vbOKOnly, "系统提示")
Exit Sub
End If
'加载dll文件,利用反射
Dim assembly As Assembly = assembly.LoadFrom(Application.StartupPath & "\\Print.dll")
Dim Print As New Print.Class1(Me.dgvWindWorkLog) '实例化打印类
Print.setstrPrint = "工作记录卡" '设置打印标题
Print.Print()
End Sub
出错啦:
以上操作均没有错,如果在同一个Demo中测试,一切正常,打印效果老好了。然后将dll文件拷贝到中谷项目目录下,在事件中调用,提示错误。

测试了好多次都觉得不应该有错,我觉得哪里都一样就是到了项目中就运行不起来。还有下面这个问题,这两个问题我整整解决了一天。唉,只怪咱水平有限、经验有限啊!
报表:
不知道这叫不叫无独有偶,竟然同一天遇到两个一样的问题。< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+PGJyPgo8L3A+CjxpbWcgc3JjPQ=="https://www.cppentry.com/upload_files/article/76/1_xwzht__.jpg" alt="\">
这也是做好的一个报表.grf,添加到程序中,结果每次运行到
Report = NewgrproLib.GridppReport
Report.LoadFromFile(Application.StartupPath& "\\报表.grf")时就提示上面的错误。
拨开云雾见青天:
我测试Demo的目标框架是.NET Framework 4.5,而中谷项目是.NETFramework 3.5。
于是……
教训:
No.1 经历了一次下次就知道如何解决和预防此类问题,自己做测试一定要细心。
其实报表中最大的问题,是我开发用的Grid++Report5.6,,给同组人的是5.0,(因为我很久前在机房合作开发时装了Grid++,安装文件找不到了,就跟当时给我传文件的那个同学又要了一份,结果两次的文件并不是同一版本)。这下热闹了,我们各种调试、各种注册、各种。。。终于决定删除重做。
No.2 合作开发一定要统一版本,不管是开发环境(包括比如VS版本、framework)、SVN客户端、调试工具以及开发过程中用到的控件等。因为稍不注意就可能是推翻重来,那可是血的代价啊!