c# Winform 用到的一个打印控件(VBprinter.DGVprint)。

给大家分享一个挺好用的打印控件。dll等下上传到资源里边。

新手可以看看

12-13补充

这个dll里边有好几个打印控件,刚知道。

有一个比这更更好用的,我把代码放到最后



  1. private void tabControl1_Click(object sender, EventArgs e)  
  2.        {  
  3.            if (tab.SelectedTab.Text == "打印预览")  
  4.            {  
  5.                myp.PageUnits = VBprinter.VB2008Print.PageExportUnit.CentiMeter;  
  6.                myp.IsImmediatePrintNotPreview = false;  
  7.                myp.IsUseDGVPadding = false;  
  8.                myp.CellMargin = new System.Drawing.Printing.Margins(10, 20, 10, 10);  
  9.   
  10.                myp.InvalidatePreview();  
  11.                tab.SelectedIndex = 1;  
  12.            }  
  13.        }  
  1. //打印预览  
  2. private void myp_PrintDocument()  
  3. {  
  4.     DataGridView newdgv = new DataGridView();  
  5.     myp.CopyDataGridView(dgvsource, newdgv, false);  
  6.     newdgv.GridColor = Color.Black;  
  7.     //打印处理过程  
  8.     myp.IsNeedCheckNewPage = false;  
  9.     System.Drawing.Printing.Margins mymargin;  
  10.     mymargin = new System.Drawing.Printing.Margins();  
  11.     mymargin.Left = Convert.ToInt32(myp.ConvertInchToCm(45));  
  12.     mymargin.Right = Convert.ToInt32(myp.ConvertInchToCm(45));  
  13.     mymargin.Top = Convert.ToInt32(myp.ConvertInchToCm(80));  
  14.     mymargin.Bottom = Convert.ToInt32(myp.ConvertInchToCm(45));  
  15.     myp.NewPage(System.Drawing.Printing.PaperKind.A4, mymargin, false);  
  16.     mymargin.Top = 20;  
  17.     //先打印表头内容  
  18.     Font f1 = new Font("黑体", 18, FontStyle.Bold);  
  19.     Font f2 = new Font("黑体", 14, FontStyle.Bold);  
  20.     Font f3 = new Font("宋体", 12);  
  21.     Font f4 = new Font("华文行楷", 12);  
  22.     string ss;  
  23.     ss = "自来水公司\n欠费查询表";  
  24.     myp.DrawTitle(ss, f1, Color.Black, 0);  
  25.     myp.NewRow(60);  
  26.     float rowheight;  
  27.     rowheight = 70;  
  28.     //float mywidth;  
  29.   
  30.     myp.NewRow(rowheight);  
  31.     ss = "制表时间:" + System.String.Format("{0:f}", System.DateTime.Now);  
  32.   
  33.     myp.DrawText(ss, myp.PaperPrintWidth, rowheight, f4, StringAlignment.Far, StringAlignment.Center, falsetruefalsefalse, 6, 0);  
  34.   
  35.     myp.NewRow(rowheight);  
  36.     //正式开始打印表格  
  37.     rowheight = 60;//表格要打印的行高  
  38.     bool needprintheader = true;  
  39.     for (int i = 0; i < dgvsource.RowCount; i++)  
  40.     {  
  41.         if (needprintheader == true)  
  42.         {  
  43.             //打印表格头  
  44.             if (i != 0)  
  45.             {  
  46.   
  47.                 //不是第一页,需要打印标题行                     
  48.                 ss = "自来水公司\n欠费查询表";  
  49.                 myp.DrawTitle(ss, f1, Color.Black, 0);  
  50.                 ss = "" + "\n" + "\n";  
  51.                 myp.DrawTitle(ss, f2, Color.Black, 0);  
  52.                 myp.Currenty = myp.Currenty + 30;//留一点空白  
  53.   
  54.             }  
  55.             //再打印表格列标题 行  
  56.             myp.DrawDGVHeader(newdgv, rowheight, truetrue"1111", 6);  
  57.             needprintheader = false;  
  58.   
  59.         }  
  60.   
  61.         if (myp.IsNewPage(rowheight) == true)  
  62.         {  
  63.             //需要换页  
  64.             myp.NewPage(System.Drawing.Printing.PaperKind.A4, mymargin, false);  
  65.             needprintheader = true;  
  66.             i = i - 1;  
  67.   
  68.         }  
  69.         else  
  70.         {  
  71.             //打印当前行  
  72.             myp.DrawDGVRow(newdgv, i, rowheight, truefalse"1111", 6);  
  73.   
  74.         }  
  75.     }  
  76.     //以下开始打印表尾  
  77.     float footerheight = 700;//表尾要打印的高度,下面打印的内容不能超过这个高度  
  78.     if (myp.IsNewPage(footerheight) == true)  
  79.     {  
  80.         //说明表尾要不能全部打印下去,先换页  
  81.         myp.NewPage(System.Drawing.Printing.PaperKind.A4, mymargin, false);  
  82.     }  
  83.   
  84.     newdgv.Dispose();  
  85.     newdgv = null;  
  86. }  




  1. public List<string> columns(DataGridView dgv)  
  2.        {  
  3.            string columnsname = "";  
  4.            string columns = "";  
  5.            List<string> columnlist = new List<string>();  
  6.            for (int i = 0; i < dgv.Columns.Count; i++)  
  7.            {  
  8.                //Type type = dt.Columns[i].DataType;  
  9.                columns = dgv.Columns[i].HeaderCell.Value.ToString();  
  10.                //columnsname = dgv.Columns[i].HeaderCell.Value.GetType().ToString();  
  11.                columnsname = dgv.Columns[i].ValueType.ToString();  
  12.                if (columnsname != "System.String")  
  13.                {  
  14.                    //columns = dgv.Columns[i].ToString(); ;  
  15.                    columns = dgv.Columns[i].HeaderCell.Value.ToString();  
  16.                    if (columnsname == "System.DateTime")  
  17.                    {  
  18.                        continue;  
  19.                    }  
  20.                    if (columnsname != "System.String")  
  21.                    {  
  22.                        columns = dgv.Columns[i].HeaderCell.Value.ToString();  
  23.                        columnlist.Add(columns);  
  24.                    }  
  25.                }  
  26.            }  
  27.            return columnlist;  
  28.        }  
  29.        VBprinter.DGVprint dgvprint4 = new VBprinter.DGVprint();  
  30.        private void button6_Click(object sender, EventArgs e)  
  31.        {  
  32.            dgvprint4.MainTitle = treeView1.Nodes[0].Text + "\n" + "用户档案修改报表";  
  33.            //dgvprint4.MainTitle = "";//分组打印测试(3.5版新功能)按联系人姓名分组汇总邮政编码列,每组连续打印,且添加行号,行号每组从1开始重新编号  
  34.   
  35.            dgvprint4.SubTitle = textBox1.Text;//"您还可以改为分栏打印或跨页打印工资条打印试试,怎么样,本功能够强大吧";  
  36.            dgvprint4.Alignment = StringAlignment.Center;//'表格居中  
  37.            dgvprint4.PrintType = VBprinter.DGVprint.mytype.MulPagesPrint;  //'普通表格VBprinter.DGVprint.mytype.GeneralPrint;   
  38.            //dgvprint4.TableFooterLeft = "表格页脚内容(左边)";  
  39.            //dgvprint4.TableFooterMiddle = "表格脚眉内容(中边)";  
  40.            //dgvprint4.TableFooterRight = "表格页脚内容(右边)";  
  41.            //dgvprint4.SortColumn = "用水量";// '只能有一列(注意,此处是列的名称而不是显示的名称)  
  42.            //dgvprint4.GroupColumn = "用水量";// '只能有一列(注意,此处是列的名称而不是显示的名称)  
  43.            // s[0] = "户数"; s[1] = "计费水量"; s[2] = "上期滞纳金"; s[3] = "应收水费"; s[4] = "实用数"; s[5] = "应收费用"; s[6] = "其它费用"; s[7] = "合计"; s[8] = "水损";  
  44.            List<string> list = columns(dgvsource);  
  45.            string sumcolumns = "";  
  46.            foreach (string item in list)  
  47.            {  
  48.                sumcolumns += item + ";";  
  49.            }  
  50.            dgvprint4.SumColumns = sumcolumns;// '如果要汇总多列的话,可用英文的分号连接起来(注意,此处是列的名称而不是显示的名称)  
  51.   
  52.            dgvprint4.GroupNewPage = false;// '每组连续打印  
  53.            dgvprint4.IsAddRowID = true;// '添加行号  
  54.            dgvprint4.IsGroupNewRowID = true//'新组行号从1开始重新编号  
  55.            dgvprint4.PaperLandscape = false//'纵向打印  
  56.            dgvprint4.Print(dgvsource, true);// '也可用dgvprint1.print(d1,true),此时会显示一个打印参数设置窗口  
  57.        }  
Private Sub Image5_Click() '打印报表 Dim i As Integer Dim pageleft As Integer Dim pageheader As Integer Dim pagefooter As Integer Dim pageright As Integer Dim startx As Integer Dim starty As Integer Dim startline As Integer Dim endline As Integer Dim usewidth As Integer Dim useheight As Integer pageheader = 25 pagefooter = 25 pageleft = 20 pageright = 20 '定义纸张类型A4 Printer.FontSize = 20 Printer.PaperSize = 9 Printer.ScaleMode = 6 Printer.FontBold = False Printer.ScaleLeft = -20 Printer.ScaleTop = -25 Printer.ScaleWidth = 210 Printer.ScaleHeight = 297 usewidth = Printer.ScaleWidth - 40 useheight = Printer.ScaleHeight - 50 Printer.CurrentX = 0 Printer.CurrentY = 0 Printer.DrawWidth = 2 '打印主标题 Printer.FontSize = 20 Printer.CurrentX = (usewidth - Printer.TextWidth(Me.Text1.Text & "经济情况表")) / 2 Printer.CurrentY = Printer.ScaleTop Printer.Print Me.Text1.Text & "经济情况表" '打印空白行 Printer.FontSize = 8 Printer.CurrentX = (usewidth - Printer.TextWidth("")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print "" '打印副标题 Printer.FontSize = 15 Printer.CurrentX = (usewidth - Printer.TextWidth(commonth & "月份经济情况报表")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print commonth & "月份经济情况报表" '打印空白行 Printer.FontSize = 8 Printer.CurrentX = (usewidth - Printer.TextWidth("")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print "" '打印表的内容 '首先打印第一条横线 '打印最上边的第一条横线 Printer.CurrentX = pageleft + Printer.ScaleLeft startline = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.FontSize = 12 Printer.CurrentY = Printer.CurrentY + 1 starty = Printer.CurrentY Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth("")) / 2 Printer.Print "" Printer.FontSize = 12 Printer.CurrentX = usewidth / 3 + ((usewidth / 3 - Printer.TextWidth("今年经济情况")) / 2) Printer.CurrentY = starty Printer.Print "今年经济情况(万元)" Printer.FontSize = 12 Printer.CurrentX = (usewidth / 3) * 2 + ((usewidth / 3 - Printer.TextWidth("去年经济情况")) / 2) Printer.CurrentY = starty Printer.Print "去年经济情况(万元)" Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 For i = 0 To 10 '判断是否该页已打满 Me.MSFlexGrid1.Row = i If Printer.CurrentY >= useheight Then '打印横线 Printer.CurrentX = Printer.ScaleLeft + pageleft Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 '打印四条竖线 endline = Printer.CurrentY Printer.Line (0, startline)-(0, endline) Printer.Line (usewidth / 3, startline)-(usewidth / 3, endline) Printer.Line ((usewidth / 3) * 2, startline)-((usewidth / 3) * 2, endline) Printer.Line (usewidth, startline)-(usewidth, endline) '打印页号 Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(Printer.Page)) / 3 - pageleft Printer.CurrentY = useheight + 3 Printer.Print Printer.Page Printer.NewPage 'NewPage告诉打印机,程序对当前输出页的发送已经结束。Printer对象应开始新的一页。 Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = pageheader + Printer.ScaleTop startline = Printer.CurrentY Else '打印一行数据 Me.MSFlexGrid1.Col = 0 Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 8 starty = Printer.CurrentY Printer.Print Me.MSFlexGrid1.Text Me.MSFlexGrid1.Col = 1 Printer.CurrentX = (Printer.ScaleWidth - 40) / 3 + ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 2 Printer.CurrentY = starty Printer.Print Me.MSFlexGrid1.Text Me.MSFlexGrid1.Col = 2 Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3) * 2 + ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 2 Printer.CurrentY = starty Printer.Print Me.MSFlexGrid1.Text Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 End If Next i '打印最后一条横线 Printer.CurrentX = Printer.ScaleLeft + pageleft Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) endline = Printer.CurrentY '打印四条竖线 Printer.Line (0, startline)-(0, endline) Printer.Line (usewidth / 3, startline)-(usewidth / 3, endline) Printer.Line ((usewidth / 3) * 2, startline)-((usewidth / 3) * 2, endline) Printer.Line (usewidth, startline)-(usewidth, endline) '打印页号 Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(Printer.Page)) / 3 - pageleft Printer.CurrentY = useheight + 3 'Printer.Print Printer.Page Printer.Print " 哈尔滨高新技术开发区" Printer.EndDoc 'EndDoc告诉VISUAL BASIC,程序创建文档结束。VISUAL BASIC应将它发送到物理打印机上打印。 If Err.Number = 0 Then MsgBox "you are successful!", , "" End If End Sub
Private Sub Image5_Click() '打印报表 Dim i As Integer Dim pageleft As Integer Dim pageheader As Integer Dim pagefooter As Integer Dim pageright As Integer Dim startx As Integer Dim starty As Integer Dim startline As Integer Dim endline As Integer Dim usewidth As Integer Dim useheight As Integer pageheader = 25 pagefooter = 25 pageleft = 20 pageright = 20 '定义纸张类型A4 Printer.FontSize = 20 Printer.PaperSize = 9 Printer.ScaleMode = 6 Printer.FontBold = False Printer.ScaleLeft = -20 Printer.ScaleTop = -25 Printer.ScaleWidth = 210 Printer.ScaleHeight = 297 usewidth = Printer.ScaleWidth - 40 useheight = Printer.ScaleHeight - 50 Printer.CurrentX = 0 Printer.CurrentY = 0 Printer.DrawWidth = 2 '打印主标题 Printer.FontSize = 20 Printer.CurrentX = (usewidth - Printer.TextWidth(Me.Text1.Text & "经济情况表")) / 2 Printer.CurrentY = Printer.ScaleTop Printer.Print Me.Text1.Text & "经济情况表" '打印空白行 Printer.FontSize = 8 Printer.CurrentX = (usewidth - Printer.TextWidth("")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print "" '打印副标题 Printer.FontSize = 15 Printer.CurrentX = (usewidth - Printer.TextWidth(commonth & "月份经济情况报表")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print commonth & "月份经济情况报表" '打印空白行 Printer.FontSize = 8 Printer.CurrentX = (usewidth - Printer.TextWidth("")) / 2 Printer.CurrentY = Printer.CurrentY + 1 Printer.Print "" '打印表的内容 '首先打印第一条横线 '打印最上边的第一条横线 Printer.CurrentX = pageleft + Printer.ScaleLeft startline = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.FontSize = 12 Printer.CurrentY = Printer.CurrentY + 1 starty = Printer.CurrentY Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth("")) / 2 Printer.Print "" Printer.FontSize = 12 Printer.CurrentX = usewidth / 3 + ((usewidth / 3 - Printer.TextWidth("今年经济情况")) / 2) Printer.CurrentY = starty Printer.Print "今年经济情况(万元)" Printer.FontSize = 12 Printer.CurrentX = (usewidth / 3) * 2 + ((usewidth / 3 - Printer.TextWidth("去年经济情况")) / 2) Printer.CurrentY = starty Printer.Print "去年经济情况(万元)" Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 For i = 0 To 10 '判断是否该页已打满 Me.MSFlexGrid1.Row = i If Printer.CurrentY >= useheight Then '打印横线 Printer.CurrentX = Printer.ScaleLeft + pageleft Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 '打印四条竖线 endline = Printer.CurrentY Printer.Line (0, startline)-(0, endline) Printer.Line (usewidth / 3, startline)-(usewidth / 3, endline) Printer.Line ((usewidth / 3) * 2, startline)-((usewidth / 3) * 2, endline) Printer.Line (usewidth, startline)-(usewidth, endline) '打印页号 Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(Printer.Page)) / 3 - pageleft Printer.CurrentY = useheight + 3 Printer.Print Printer.Page Printer.NewPage 'NewPage告诉打印机,程序对当前输出页的发送已经结束。Printer对象应开始新的一页。 Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = pageheader + Printer.ScaleTop startline = Printer.CurrentY Else '打印一行数据 Me.MSFlexGrid1.Col = 0 Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 8 starty = Printer.CurrentY Printer.Print Me.MSFlexGrid1.Text Me.MSFlexGrid1.Col = 1 Printer.CurrentX = (Printer.ScaleWidth - 40) / 3 + ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 2 Printer.CurrentY = starty Printer.Print Me.MSFlexGrid1.Text Me.MSFlexGrid1.Col = 2 Printer.CurrentX = ((Printer.ScaleWidth - 40) / 3) * 2 + ((Printer.ScaleWidth - 40) / 3 - Printer.TextWidth(Me.MSFlexGrid1.Text)) / 2 Printer.CurrentY = starty Printer.Print Me.MSFlexGrid1.Text Printer.CurrentX = pageleft + Printer.ScaleLeft Printer.CurrentY = Printer.CurrentY + 1 Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) Printer.CurrentY = Printer.CurrentY + 1 End If Next i '打印最后一条横线 Printer.CurrentX = Printer.ScaleLeft + pageleft Printer.Line -((Printer.ScaleLeft + Printer.ScaleWidth - pageleft), Printer.CurrentY) endline = Printer.CurrentY '打印四条竖线 Printer.Line (0, startline)-(0, endline) Printer.Line (usewidth / 3, startline)-(usewidth / 3, endline) Printer.Line ((usewidth / 3) * 2, startline)-((usewidth / 3) * 2, endline) Printer.Line (usewidth, startline)-(usewidth, endline) '打印页号 Printer.CurrentX = (Printer.ScaleWidth - Printer.TextWidth(Printer.Page)) / 3 - pageleft Printer.CurrentY = useheight + 3 'Printer.Print Printer.Page Printer.Print " 哈尔滨高新技术开发区" Printer.EndDoc 'EndDoc告诉VISUAL BASIC,程序创建文档结束。VISUAL BASIC应将它发送到物理打印机上打印。 If Err.Number = 0 Then MsgBox "you are successful!", , "" End If End Sub
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值