winfrom 打印和预览

  在windows应用程序中文档的打印是一项非常重要的功能,在以前一直是一个非常复杂的工作,Microsoft .Net Framework的打印功能都以组件的方式提供,为程序员提供了很大的方便。由于工作中常用到印功功能,个人写了一个专门打印DataGridView对象一个类,可以实现预览和打印功能,而且自动缩放字段、添加颜色;在预览时可以根据不同的比例查看效果,可以查看第几页数据和直接打印第几页的 数据。请看效果图。

二、附上调用代码

三、提供源码:

  1 using System;
  2 using System.Collections.Generic;
  3 using System.Linq;
  4 using System.Text;
  5 using System.Drawing.Printing;
  6 using System.Windows.Forms;
  7 using System.Drawing;
  8 using Dys.Component;
  9 namespace Bll
 10 {
 11     /// <summary>
 12     /// 打印
 13     /// 开心懒人
 14     /// 2014-10-10
 15     /// </summary>
 16     public class PrintDataGridView
 17     {
 18
 19         static DataGridView dgv;
 20         static string titleName = ""; //标题名称
 21         static string titleName2 = ""; //第二标题名称
 22         static int rowIndex = 0;   //当前行
 23         static int page = 1; //当前页
 24         static int rowsPerPage = 0;  //每页显示多少行
 25         /// <summary>
 26         /// 打印DataGridView
 27         /// </summary>
 28         /// <param name="dataGridView">要打印的DataGridView</param>
 29         /// <param name="title">标题</param>
 30         /// <param name="title2">第二标题,可以为null</param>
 31         public static void Print(DataGridView dataGridView, string title, string title2)
 32         {
 33             try
 34             {
 35                 if (dataGridView == null) { return; }
 36                 titleName = title;
 37                 titleName2 = title2;
 38                 dgv = dataGridView;
 39                 PrintPreviewDialog ppvw = new PrintPreviewDialog();
 40                 ppvw.PrintPreviewControl.Zoom = 1.0; //显示比例为100%
 41                 PrintDocument printDoc = new PrintDocument();
 42                 PrintDialog MyDlg = new PrintDialog();
 43                 MyDlg.Document = printDoc;
 44                 printDoc.DefaultPageSettings.PaperSize = new PaperSize("A4", 850, 1000);
 45                 printDoc.DefaultPageSettings.Margins = new Margins(60, 60, 60, 60); //设置边距
 46                 ppvw.Document = printDoc;   //设置要打印的文档
 47                 ((Form)ppvw).WindowState = FormWindowState.Maximized; //最大化
 48                 rowIndex = 0; //当前行
 49                 page = 1;  //当前页
 50                 printDoc.PrintPage += new PrintPageEventHandler(printDoc_PrintPage); //打印事件
 51                 printDoc.EndPrint += new PrintEventHandler(printDoc_EndPrint);
 52                 ppvw.Document.DefaultPageSettings.Landscape = true;    // 设置打印为横向
 53                 ppvw.ShowDialog(); //打开预览
 54
 55             }
 56             catch (Exception ex)
 57             {
 58                 MessageBox.Show(ex.Message, "错误", MessageBoxButtons.OK, MessageBoxIcon.Error);
 59             }
 60
 61         }
 62
 63         static void printDoc_EndPrint(object sender, PrintEventArgs e)
 64         {
 65             rowIndex = 0; //当前行
 66             page = 1;  //当前页
 67             rowsPerPage = 0;//每页显示多少行
 68         }
 69         private static void printDoc_PrintPage(object sender, PrintPageEventArgs e)
 70         {
 71
 72             //标题字体
 73             Font titleFont = new Font("微软雅黑", 16, FontStyle.Bold);
 74             //标题尺寸
 75             SizeF titleSize = e.Graphics.MeasureString(titleName, titleFont, e.MarginBounds.Width);
 76             //x坐标
 77             int x = e.MarginBounds.Left;
 78             //y坐标
 79             int y = Convert.ToInt32(e.MarginBounds.Top - titleSize.Height);
 80             //边距以内纸张宽度
 81             int pagerWidth = e.MarginBounds.Width;
 82             //画标题
 83             e.Graphics.DrawString(titleName, titleFont, Brushes.Black, x + (pagerWidth - titleSize.Width) / 2, y);
 84             y += (int)titleSize.Height;
 85             if (titleName2 != null && titleName2 != "")
 86             {
 87
 88                 //画第二标题
 89                 e.Graphics.DrawString(titleName2, dgv.Font, Brushes.Black, x + (pagerWidth - titleSize.Width) / 2 + 200, y);
 90                 //第二标题尺寸
 91                 SizeF titleSize2 = e.Graphics.MeasureString(titleName2, dgv.Font, e.MarginBounds.Width);
 92                 y += (int)titleSize2.Height;
 93
 94             }
 95
 96             //表头高度
 97             int headerHeight = 0;
 98             //纵轴上 内容与线的距离
 99             int padding = 6;
100             //所有显示列的宽度
101             int columnsWidth = 0;
102             //计算所有显示列的宽度
103             foreach (DataGridViewColumn column in dgv.Columns)
104             {
105
106                 //隐藏列返回
107                 if (!column.Visible) continue;
108                 //所有显示列的宽度
109                 columnsWidth += column.Width;
110             }
111
112             //计算表头高度
113             foreach (DataGridViewColumn column in dgv.Columns)
114             {
115
116                 //列宽
117                 int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
118                 //表头高度
119                 int temp = (int)e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Height + 2 * padding;
120                 if (temp > headerHeight) headerHeight = temp;
121             }
122
123             //画表头
124
125             foreach (DataGridViewColumn column in dgv.Columns)
126             {
127
128                 //隐藏列返回
129                 if (!column.Visible) continue;
130                 //列宽
131                 int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
132                 //内容居中要加的宽度
133                 float cenderWidth = (columnWidth - e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Width) / 2;
134                 if (cenderWidth < 0) cenderWidth = 0;
135                 //内容居中要加的高度
136                 float cenderHeight = (headerHeight + padding - e.Graphics.MeasureString(column.HeaderText, column.InheritedStyle.Font, columnWidth).Height) / 2;
137                 if (cenderHeight < 0) cenderHeight = 0;
138                 //画背景
139                 e.Graphics.FillRectangle(new SolidBrush(Color.LightGray), new Rectangle(x, y, columnWidth, headerHeight));
140                 //画边框
141                 e.Graphics.DrawRectangle(Pens.Black, new Rectangle(x, y, columnWidth, headerHeight));
142                 ////画上边线
143
144                 //e.Graphics.DrawLine(Pens.Black, x, y, x + columnWidth, y);
145
146                 ////画下边线
147
148                 //e.Graphics.DrawLine(Pens.Black, x, y + headerHeight, x + columnWidth, y + headerHeight);
149
150                 ////画右边线
151
152                 //e.Graphics.DrawLine(Pens.Black, x + columnWidth, y, x + columnWidth, y + headerHeight);
153
154                 //if (x == e.MarginBounds.Left)
155
156                 //{
157
158                 //    //画左边线
159
160                 //    e.Graphics.DrawLine(Pens.Black, x, y, x, y + headerHeight);
161
162                 //}
163
164                 //画内容
165                 e.Graphics.DrawString(column.HeaderText, column.InheritedStyle.Font, new SolidBrush(column.InheritedStyle.ForeColor), new RectangleF(x + cenderWidth, y + cenderHeight, columnWidth, headerHeight));
166                 x += columnWidth;
167
168             }
169
170             x = e.MarginBounds.Left;
171             y += headerHeight;
172             while (rowIndex < dgv.Rows.Count)
173             {
174
175                 DataGridViewRow row = dgv.Rows[rowIndex];
176                 if (row.Visible)
177                 {
178
179                     int rowHeight = 0;
180                     foreach (DataGridViewCell cell in row.Cells)
181                     {
182
183                         DataGridViewColumn column = dgv.Columns[cell.ColumnIndex];
184                         if (!column.Visible || cell.Value == null) continue;
185                         int tmpWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
186                         int temp = (int)e.Graphics.MeasureString(cell.Value.ToString(), column.InheritedStyle.Font, tmpWidth).Height + 2 * padding;
187                         if (temp > rowHeight) rowHeight = temp;
188                     }
189
190                     foreach (DataGridViewCell cell in row.Cells)
191                     {
192
193                         DataGridViewColumn column = dgv.Columns[cell.ColumnIndex];
194                         if (!column.Visible) continue;
195                         int columnWidth = (int)(Math.Floor((double)column.Width / (double)columnsWidth * (double)pagerWidth));
196                         e.Graphics.DrawRectangle(Pens.Black, new Rectangle(x, y, columnWidth, rowHeight));
197
198                         if (cell.Value != null)
199                         {
200
201                             //内容居中要加的宽度
202
203                             float cenderWidth = (columnWidth - e.Graphics.MeasureString(cell.Value.ToString(), cell.InheritedStyle.Font, columnWidth).Width) / 2;
204
205                             if (cenderWidth < 0) cenderWidth = 0;
206
207                             //内容居中要加的高度
208
209                             float cenderHeight = (rowHeight + padding - e.Graphics.MeasureString(cell.Value.ToString(), cell.InheritedStyle.Font, columnWidth).Height) / 2;
210
211                             if (cenderHeight < 0) cenderHeight = 0;
212
213                             ////画下边线
214
215                             //e.Graphics.DrawLine(Pens.Black, x, y + rowHeight, x + columnWidth, y + rowHeight);
216
217                             ////画右边线
218
219                             //e.Graphics.DrawLine(Pens.Black, x + columnWidth, y, x + columnWidth, y + rowHeight);
220
221                             //if (x == e.MarginBounds.Left)
222
223                             //{
224
225                             //    //画左边线
226
227                             //    e.Graphics.DrawLine(Pens.Black, x, y, x, y + rowHeight);
228
229                             //}
230
231                             //画内容
232
233                             e.Graphics.DrawString(cell.Value.ToString(), column.InheritedStyle.Font, new SolidBrush(cell.InheritedStyle.ForeColor), new RectangleF(x + cenderWidth, y + cenderHeight, columnWidth, rowHeight));
234
235                         }
236
237                         x += columnWidth;
238
239                     }
240
241                     x = e.MarginBounds.Left;
242
243                     y += rowHeight;
244
245                     if (page == 1) rowsPerPage++;
246
247                     //打印下一页
248
249                     if (y + rowHeight > e.MarginBounds.Bottom)
250                     {
251
252                         e.HasMorePages = true;
253
254                         break;
255
256                     }
257
258                 }
259
260                 rowIndex++;
261
262             }
263
264             //页脚
265             string footer = " 第 " + page + " 页,共 " + Math.Ceiling(((double)dgv.Rows.Count / rowsPerPage)).ToString() + " 页";
266             //画页脚
267             e.Graphics.DrawString(footer, dgv.Font, Brushes.Black, x + (pagerWidth - e.Graphics.MeasureString(footer, dgv.Font).Width) / 2, e.MarginBounds.Bottom);
268             page++;
269
270         }
271
272
273     }
274
275 }

时间: 2024-10-12 19:03:21

winfrom 打印和预览的相关文章

JS 打印功能代码可实现打印预览、打印设置等

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Conten

c#教程之打印和打印预览

4.1      打印和打印预览 打印和打印预览是一个编辑器必须具有的功能,本节介绍实现打印和打印预览的方法.一般要实现如下菜单项:打印.打印预览.页面设置. 4.8.1PrintDocument类 PrintDocument组件是用于完成打印的类,其常用属性.方法和事件如下:l  属性DocumentName:字符串类型,记录打印文档时显示的文档名(例如,在打印状态对话框或打印机队列中显示).l  方法Print:开始文档的打印.l  事件BeginPrint:在调用Print方法后,在打印文

JavaScript 实现打印,打印预览,打印设置

WebBrowser是IE内置的浏览器控件,无需用户下载. 一.WebBrowser控件 <object ID='WebBrowser' WIDTH=0 HEIGHT=0 CLASSID='CLSID:8856F961-340A-11D0-A96B-00C04FD705A2'></object> 二.WebBrowder控件的方法 //打印 WebBrowser1.ExecWB(6,1); //打印设置 WebBrowser1.ExecWB(8,1); //打印预览 WebBrow

JS 打印功能代码(包括打印预览、打印设置等)

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

打印预览新体验

在早期版本的Microsoft Office应用程序中,文档的打印设置和打印预览需要分别进行.而在Microsoft Office 2013当中,引入了“后台视图”的功能,让文档的打印和预览“合二为一”,在进行打印选项设置的同时,即可预览最终的打印效果. (1)使用Word 2013打开文档后,单击[文件]按钮即可打开全新的后台视图,其自动显示的是“信息”视图中的内容. (2)切换到“打印”选项卡,在这里您可以方便地进行打印选项的设置,与此同时,在右侧的窗格中即可同步预览到打印效果. (3)在预

Ueditor百度富文本编辑器添加h5手机端预览功能

一.需求分析 项目中用到富文本编辑器的地方很多,富文本编辑器一般都是在pc后台上,因为前端是手机端,因此每次再富文本编辑内容保存以后,在手机端展示的样式和我们在富文本中编辑的不太一样,因此就需要在编写完内容之后可以模拟手机端进行预览一下,但是后端用富文本编辑器的地方比较多,不适合在每个页面进行开发,因此做成插件功能放入ueditor之中的方式改动的代价比较小. 首先看下效果 二.代码 先在ueditor.css中添加按钮样式图片: 路径:ueditor\themes\default\css\ue

C#winfrom打印与打印预览

引入printDocument控件 /// <summary> /// 打印方法 /// </summary> public void Print() { //实例化打印对象 PrintDocument printDocument1 = new PrintDocument(); //设置打印用的纸张,当设置为Custom的时候,可以自定义纸张的大小 printDocument1.DefaultPageSettings.PaperSize = new PaperSize("

基于Metronic的Bootstrap开发框架经验总结(9)--实现Web页面内容的打印预览和保存操作

在前面介绍了很多篇相关的<Bootstrap开发框架>的系列文章,这些内容基本上覆盖到了我这个Bootstrap框架的各个主要方面的内容,总体来说基本达到了一个稳定的状态,随着时间的推移可以会引入一些更好更新的内容进行完善,本篇继续这个系列,主要介绍如何实现Web页面内容的打印预览和保存操作. 1.Web页面打印的问题 在此之前,我一般使用比较好用的LODOP来执行打印的操作,这个在我之前有很多文章都有涉及,这个控件是一个ActiveX的控件,需要下载安装后就可以在页面是进行打印的排版设计,预

jqprint的网页打印,打印预览可以包含图片

自己负责的模块需要有个试卷打印的功能,需要将网页特定范围内的内容打印出来,所以选择了jquery.jqprint脚本 用起来也非常简单. //打印    $("#printPage").jqprint({        debug: false,//如果是true则可以显示iframe查看效果,默认是false         importCSS: true,//true表示引进原来的页面的css,默认是true.        printContainer: true,//表示如果原