(100分)求C#打印代码,如果分觉得不够,还可再加!在线等!!!急!!!!!!

repqo 2006-09-28 12:02:02
我现在要做一个名片打印的工作,纯文字的

我有一个DataGridView的表,表单格式如下:

序号 打印内容 打印份数 是否打印
1 abcde 100 是
2 cdefg 50 否
3 dfsak 2 是

像以上格式,能否一次性打印以上多条记录,就把需要打印的内容剩上上份数!

希望能给出具体实现的代码!谢谢了!如觉分不够,可以另开贴,加给你!
...全文
1254 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
魔导师 2006-11-02
  • 打赏
  • 举报
回复
帮你顶
amingo 2006-09-29
  • 打赏
  • 举报
回复


Public Sub Print()
Try
PrintDataGrid = New System.Drawing.Printing.PrintDocument()
AddHandler PrintDataGrid.PrintPage, AddressOf Me.PrintDataGrid_PrintPage
'PrintDataTable.Print()

'打印机设置对话框
PageSetup = New PageSetupDialog()
PageSetup.PageSettings = PrintDataGrid.DefaultPageSettings
If PageSetup.ShowDialog() = DialogResult.Cancel Then
Exit Sub
End If

'当前页是横向还是纵向打印
'计算当前页总共可以打印的行数
If PrintDataGrid.DefaultPageSettings.Landscape = False Then
PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Height / (PrintFont.Height + 5)
Else
PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Width / (PrintFont.Height + 5)
End If


'如果用户选择自定义纸张大小打印,则按B5纸打印,不管实际纸张大小
If PrintDataGrid.DefaultPageSettings.PaperSize.PaperName.ToString = "custom" Then

End If

'预览窗口
PrintPriview = New PrintPreviewDialog()
PrintPriview.Document = PrintDataGrid
PrintPriview.ShowDialog()

Catch ex As Exception
MessageBox.Show("error:" & ex.ToString)
Finally

End Try
End Sub

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

'A4纸 A4 纸,210 x 297 毫米。
'B5纸 B5 纸,182 x 257 毫米。

Dim strPrint As String '当前要打印的文本
Dim DrawBrush As New SolidBrush(System.Drawing.Color.Blue) '当前画笔颜色

Dim X As Integer '当前要打印的文本的横坐标
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 '因为每打印一个新页都要计算还有多少页没有打印所以以打印的页数初始为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)
'文档标题----------------打印结束

'得到DATAGRID的所有列名
Dim ColumnText(DataGridTable.Columns.Count) As String
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) '画线
'结束---------------------得到DATAGRID的所有列名


Dim PrintingLine As Integer = 0 '当前页面已经打印的记录行数

'用于确定是否换页的标记
Dim strUpData As String = "" '当前数据的前一个数据
Dim strNonce 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 <> "" Then 'And strNonce <> ""
If strUpData <> DataGridRow(ColumnText(0)) Then
ev.HasMorePages = True
Exit Sub

End If
End If
End If

ev.Graphics.DrawString(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

'打印完最后一条记录后结束打印.
'如:当前有500条记录.从0开始打印,实际打印的为第一条记录.则打印500条时实际的是第501条记录.也就是最后一条
'datagridtable.rows.count得到就是表内的实际记录条数,共有多少条记录(从1开始),当
'printrecordcomplete>=datagridtable.rows.count也就是当前已经打印到了500条,加1后将要打印第501条,越界,则结束.
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



'画线 只必指定当前行的打印文字的开始位置就可,x,y为当前行文字的打印位置
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 aa As PrintDataGrid.PrintDataGrid

aa = New PrintDataGrid.PrintDataGrid(DataGrid1)

aa.setPrintFont() = New System.Drawing.Font("宋体", 12) '打印文本的字体
aa.setPrintRecordNumber = 30 '每页要打印的记录行数

aa.Print()


原创
lsmsky 2006-09-29
  • 打赏
  • 举报
回复
Private aa As PrintDataGrid.PrintDataGrid

aa = New PrintDataGrid.PrintDataGrid(DataGrid1)

aa.setPrintFont() = New System.Drawing.Font("宋体", 12) '打印文本的字体
aa.setPrintRecordNumber = 30 '每页要打印的记录行数

aa.Print()

我试过了,可以用的.
repqo 2006-09-28
  • 打赏
  • 举报
回复
就像上面的datagridview表里的数据

打印结果:
就一个文本abcde打500张 dfsak 打2张

选不打印的,就不打

名片嘛,大家不都见过,我这个名片,只有文字,文字我自己已经处理好了,放在打印内容里了!只要直接按内容与张数打出来就好了!
laohuchiren 2006-09-28
  • 打赏
  • 举报
回复
问题都没有表达清楚,怎么帮你?
xyoer 2006-09-28
  • 打赏
  • 举报
回复

Public Sub Print()
Try
PrintDataGrid = New System.Drawing.Printing.PrintDocument()
AddHandler PrintDataGrid.PrintPage, AddressOf Me.PrintDataGrid_PrintPage
'PrintDataTable.Print()

'打印机设置对话框
PageSetup = New PageSetupDialog()
PageSetup.PageSettings = PrintDataGrid.DefaultPageSettings
If PageSetup.ShowDialog() = DialogResult.Cancel Then
Exit Sub
End If

'当前页是横向还是纵向打印
'计算当前页总共可以打印的行数
If PrintDataGrid.DefaultPageSettings.Landscape = False Then
PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Height / (PrintFont.Height + 5)
Else
PrintLines = PrintDataGrid.DefaultPageSettings.PaperSize.Width / (PrintFont.Height + 5)
End If


'如果用户选择自定义纸张大小打印,则按B5纸打印,不管实际纸张大小
If PrintDataGrid.DefaultPageSettings.PaperSize.PaperName.ToString = "custom" Then

End If

'预览窗口
PrintPriview = New PrintPreviewDialog()
PrintPriview.Document = PrintDataGrid
PrintPriview.ShowDialog()

Catch ex As Exception
MessageBox.Show("error:" & ex.ToString)
Finally

End Try
End Sub

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

'A4纸 A4 纸,210 x 297 毫米。
'B5纸 B5 纸,182 x 257 毫米。

Dim strPrint As String '当前要打印的文本
Dim DrawBrush As New SolidBrush(System.Drawing.Color.Blue) '当前画笔颜色

Dim X As Integer '当前要打印的文本的横坐标
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 '因为每打印一个新页都要计算还有多少页没有打印所以以打印的页数初始为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)
'文档标题----------------打印结束

'得到DATAGRID的所有列名
Dim ColumnText(DataGridTable.Columns.Count) As String
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) '画线
'结束---------------------得到DATAGRID的所有列名


Dim PrintingLine As Integer = 0 '当前页面已经打印的记录行数

'用于确定是否换页的标记
Dim strUpData As String = "" '当前数据的前一个数据
Dim strNonce 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 <> "" Then 'And strNonce <> ""
If strUpData <> DataGridRow(ColumnText(0)) Then
ev.HasMorePages = True
Exit Sub

End If
End If
End If

ev.Graphics.DrawString(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

'打印完最后一条记录后结束打印.
'如:当前有500条记录.从0开始打印,实际打印的为第一条记录.则打印500条时实际的是第501条记录.也就是最后一条
'datagridtable.rows.count得到就是表内的实际记录条数,共有多少条记录(从1开始),当
'printrecordcomplete>=datagridtable.rows.count也就是当前已经打印到了500条,加1后将要打印第501条,越界,则结束.
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



'画线 只必指定当前行的打印文字的开始位置就可,x,y为当前行文字的打印位置
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 aa As PrintDataGrid.PrintDataGrid

aa = New PrintDataGrid.PrintDataGrid(DataGrid1)

aa.setPrintFont() = New System.Drawing.Font("宋体", 12) '打印文本的字体
aa.setPrintRecordNumber = 30 '每页要打印的记录行数

aa.Print()



功能:可以直接打印DATAGRID控件中的数据,但不能对数据进行格式化,功能还在完善中:)



转的...可能对楼主有用
xyoer 2006-09-28
  • 打赏
  • 举报
回复
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



''=======================================
'DATAGRID控件通用打印类
'中和科技-孙利臣
'于2003年05月27日17:05
'用于打印DATAGRID控件中的数据.

'=======================================


Public Class PrintDataGrid
'用户可自定义
Private PrintFont As New Font("宋体", 10) '当前要打印文本的字体及字号
Private PrintLines As Integer = 50 '当前页共要分成多少行.
Private PrintRecordNumber As Integer = 45 '当前页共要打印的记录的行数

'以下为模块内部使用
Private DataGridSource As DataGrid
Private ev As PrintPageEventArgs
Private PrintDataGrid As PrintDocument
Private PrintPriview As PrintPreviewDialog
Private PageSetup As PageSetupDialog
Private PrintScale As Double = 1 '当前要打印的数据与DATAGRID控件内数据的比例

Private DataGridColumn As DataColumn
Private DataGridRow As DataRow
Private DataGridTable As DataTable

Private Cols As Integer '当前要打印的列
Private Rows As Integer = 1 '当前要打印的行

Private ColsCount As Integer '当前DATAGRID共有多少列

Private PrintingLineNumber As Integer = 0 '当前正要打印的行号
Private PageRecordNumber As Integer '当前要所要打印的记录行数,由计算得到.

Dim X_unit As Integer '表的基本单位
Dim Y_unit As Integer

Private PrintingPageNumber As Integer = 0 '正要打印的页号

Private PageNumber As Integer '共需要打印的页数
Private PrintRecordLeave As Integer '当前还有多少页没有打印
Private PrintRecordComplete As Integer = 0 '已经打印完的记录数

Sub New(ByVal TableSource As DataGrid)
DataGridSource = TableSource
DataGridTable = New DataTable()
DataGridTable = DataGridSource.DataSource()
ColsCount = DataGridTable.Columns.Count
End Sub

'用户自定义字体及字号
Public WriteOnly Property setPrintFont() As System.Drawing.Font
Set(ByVal Value As System.Drawing.Font)
PrintFont = Value
End Set
End Property

'设置每页要打印的的记录条数
Public WriteOnly Property setPrintRecordNumber() As Integer
Set(ByVal Value As Integer)
PrintRecordNumber = Value
End Set
End Property



repqo 2006-09-28
  • 打赏
  • 举报
回复
顶啊,有没有人来给具体一点的代码啊
oneiter 2006-09-28
  • 打赏
  • 举报
回复
参考这个:http://dev.csdn.net/develop/article/18/18711.shtm
repqo 2006-09-28
  • 打赏
  • 举报
回复
还没有人帮下吗?解决立即给分啊
andylauhai 2006-09-28
  • 打赏
  • 举报
回复
金质打印通
repqo 2006-09-28
  • 打赏
  • 举报
回复
小弟从没写过打印程序,望高手赐教
myminimouse 2006-09-28
  • 打赏
  • 举报
回复
帮顶~
tianwenjie 2006-09-28
  • 打赏
  • 举报
回复
把数据送到PrintDocument循环打印不就行了,具体操作看看关于打印的帮助
repqo 2006-09-28
  • 打赏
  • 举报
回复
自己顶

110,577

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧