关于C#报表设计中的一点个人经验(winform),本篇文章是借鉴别人的。。。。用于收藏
2013-09-25 11:47
726 查看
关于C#报表设计中的一点个人经验(winform)
1.一个报表设计器。
2.一个报表格式解析器。。
虽然比不上完整的商业报表设计器。。但也够用了。。
另:还有一个Web报表生成器。。逻辑功能已全部完成的。。
就是说在b/s模式下生成的报表。。完全不用第三方控件!生成的报表效果可满足一般的应用。。
有希望的朋友可给我留言。。
.net打印相关的控件
通常在打印作业中,用户会有打印页面设置,打印机设置,打印预览,打印等几个常用的
操作.在.net 中有相应的控件对应上述的应用操作.
1.页面设置,使用pagesetupDialog控件
2.打印机设置,使用PrintDialog控件
3.打印预览,PrintpreviewDialog控件
4.打印,利用PrintDocument.print()进行打印..
其它控件较易理解,在此主要说一下printDocument控件.
PrintDocument 控件本质的说,它是一个指向内存区域的指针.
该内存区域存放的就是要打印的内容.而且其中包括页面格式,如横印,直印,A3纸,A4
纸设置等,
printdocument控件也可以理解是一张"白纸",你可以在上面写上任何东东..比如文字
, 图片,各种图案.等等..你写上什么,它就打印什么..有一个很重要的"动作"要注意.
就是在什么时候"写上"东东呢..这个要写的"时间"就是用printpage事件..
printpage事件,表示当要在printdocument写东东时,会触发该事件..然后你可以在该
事件放上你要写的东东.比如在 :
上述代码打印时,就只是在"纸上"(printdocument)显示一条直线,如想写上文字,再增加
代码.如g.DrawString("测试文字", printFont, myBrush, 10,20, new
StringFormat());
当进行页面设置时,首先必须先将printDocument这个控件"绑定"到pagesetupdialog
控件..表示说现在进行页面设置的是对这个PrintDocument设置...这样页面设置完毕后
才可对printDoument有效..
同样,打印机设置也须对printdocument和printdialog绑定.
打印预览也须对printpreviewdilog和printdocument绑定..
上面是对.net相关打印控件的简述
下面分析一下实际情况的打印原理,
假设现在要在页面顶端打印"2008北京奥运" ,加粗,20号字体
然后在字体下面一横线
接着打印比赛项目.比如排球,网球...(这可能有很多页)
最后在结束时(也是最后一页),打印总计比赛项目个数.图如下
2008北京奥运
-------------------------------------------------------
1. 排球
2. 网球
3. 足球
........
........
-------------------------------------------------------
比赛总项目: xx
分析:
第一,先把打印内容写在"纸"上(printdocument的printpage事件)
1.先在printdocument的顶端写上 "2008北京奥运 "
2.再画横线.
3.从数据库读取比赛项目.并写上比赛项目
4.结束后再画一直线,
5.再打印比赛总项目:xxx
6.打印完毕.
第二,把printdocument绑定到pagesetupDialog,实现页面设置
第三,把printdocument绑定到PrintDialog实现打印机设置
第四.把printdocument绑定到PrintpreviewDialog实现打印预览
第五,利用printdocument.print()方法实现直接打印..
1.一个报表设计器。
2.一个报表格式解析器。。
虽然比不上完整的商业报表设计器。。但也够用了。。
另:还有一个Web报表生成器。。逻辑功能已全部完成的。。
就是说在b/s模式下生成的报表。。完全不用第三方控件!生成的报表效果可满足一般的应用。。
有希望的朋友可给我留言。。
.net打印相关的控件
通常在打印作业中,用户会有打印页面设置,打印机设置,打印预览,打印等几个常用的
操作.在.net 中有相应的控件对应上述的应用操作.
1.页面设置,使用pagesetupDialog控件
2.打印机设置,使用PrintDialog控件
3.打印预览,PrintpreviewDialog控件
4.打印,利用PrintDocument.print()进行打印..
其它控件较易理解,在此主要说一下printDocument控件.
PrintDocument 控件本质的说,它是一个指向内存区域的指针.
该内存区域存放的就是要打印的内容.而且其中包括页面格式,如横印,直印,A3纸,A4
纸设置等,
printdocument控件也可以理解是一张"白纸",你可以在上面写上任何东东..比如文字
, 图片,各种图案.等等..你写上什么,它就打印什么..有一个很重要的"动作"要注意.
就是在什么时候"写上"东东呢..这个要写的"时间"就是用printpage事件..
printpage事件,表示当要在printdocument写东东时,会触发该事件..然后你可以在该
事件放上你要写的东东.比如在 :
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Graphics g = e.Graphics; //获得绘图对象, g.DrawLine(myPen,0,0,10,0); //表示在打印时画一直线 }
上述代码打印时,就只是在"纸上"(printdocument)显示一条直线,如想写上文字,再增加
代码.如g.DrawString("测试文字", printFont, myBrush, 10,20, new
StringFormat());
当进行页面设置时,首先必须先将printDocument这个控件"绑定"到pagesetupdialog
控件..表示说现在进行页面设置的是对这个PrintDocument设置...这样页面设置完毕后
才可对printDoument有效..
同样,打印机设置也须对printdocument和printdialog绑定.
打印预览也须对printpreviewdilog和printdocument绑定..
上面是对.net相关打印控件的简述
下面分析一下实际情况的打印原理,
假设现在要在页面顶端打印"2008北京奥运" ,加粗,20号字体
然后在字体下面一横线
接着打印比赛项目.比如排球,网球...(这可能有很多页)
最后在结束时(也是最后一页),打印总计比赛项目个数.图如下
2008北京奥运
-------------------------------------------------------
1. 排球
2. 网球
3. 足球
........
........
-------------------------------------------------------
比赛总项目: xx
分析:
第一,先把打印内容写在"纸"上(printdocument的printpage事件)
1.先在printdocument的顶端写上 "2008北京奥运 "
2.再画横线.
3.从数据库读取比赛项目.并写上比赛项目
4.结束后再画一直线,
5.再打印比赛总项目:xxx
6.打印完毕.
第二,把printdocument绑定到pagesetupDialog,实现页面设置
第三,把printdocument绑定到PrintDialog实现打印机设置
第四.把printdocument绑定到PrintpreviewDialog实现打印预览
第五,利用printdocument.print()方法实现直接打印..
private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e) { Graphics g = e.Graphics; //获得绘图对象 this.intPage++; if(this.intPage==1) { myHeader.ProDrawReportHeader(e,this.intPage); //报表表头 } myPageHeader.ProDrawPageHeader(e); //报表页头 //float yPosition=myDetail.ProDrawDetail(g,e,tbPublic); //明细,并返回当页最底的位置,以便可以给页尾打印。 float yPosition=myDetailGroup.ProDrawDetailGroup(g,e,tbPublic,tbPublic2); //打印分组明细 myPageFooter.ProDrawPageFooter(g,yPosition+20); //报表页尾 if( myDetailGroup.intnowrow<tbPublic.Rows.Count) { e.HasMorePages=true; } else { e.HasMorePages=false; myReportFooter.ProDrawReportHeader(g,yPosition+10); //报表表尾 myDetailGroup.intnowrow=0; this.intPage=0; } }
public float ProDrawDetail(System.Drawing.Graphics myGraph,System.Drawing.Printing.PrintPageEventArgs e,DataTable myTable) { if(myGraph==null) return -1; float linesPerPage = 0; //页面的行号 float yPosition = 0; //绘制字符串的纵向位置 int count = 0; //行计数器 float leftMargin = e.MarginBounds.Left; //左边距 float topMargin = e.MarginBounds.Top; //上边距 string line = null; //行字符串 Font printFont =new Font("Roman",12); SolidBrush myBrush = new SolidBrush(Color.Black);//刷子 linesPerPage = e.MarginBounds.Height / printFont.GetHeight(myGraph)-4;//每页可打印的行数 System.Drawing.Pen myPen=new Pen(myBrush); //myGraph.DrawRectangle(myPen,leftMargin,topMargin,e.MarginBounds.Width,e.MarginBounds.Height); while(count < linesPerPage && this.intnowrow<myTable.Rows.Count) { yPosition = topMargin + (count * printFont.GetHeight(myGraph))+60; for(int k=0;k<myTable.Columns.Count-1;k++) { line=myTable.Rows[this.intnowrow]["c"+k.ToString()].ToString(); myGraph.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat()); leftMargin=leftMargin+160; } //测试附加id line=myTable.Rows[this.intnowrow]["id"].ToString(); myGraph.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat()); leftMargin=leftMargin+160; leftMargin=e.MarginBounds.Left; myGraph.DrawLine(myPen,leftMargin,yPosition+2,e.MarginBounds.Width,yPosition+2); count++; line=""; this.intnowrow=this.intnowrow+1; } //结束 myPen.Color=Color.PaleGreen; myGraph.DrawLine(myPen,leftMargin,yPosition+2,e.MarginBounds.Width,yPosition+2); //最后一横线 myPen.Color=Color.DarkTurquoise; myGraph.DrawLine(myPen,e.MarginBounds.Left,e.MarginBounds.Top,e.MarginBounds.Left,e.MarginBounds.Height); myGraph.DrawLine(myPen,e.MarginBounds.Left+160,e.MarginBounds.Top,e.MarginBounds.Left+160,e.MarginBounds.Height); myGraph.DrawLine(myPen,e.MarginBounds.Left+320,e.MarginBounds.Top,e.MarginBounds.Left+320,e.MarginBounds.Height); return yPosition; }
public void ProDrawPageFooter(System.Drawing.Graphics myGraph,float intY) { if(myGraph==null) return; string strText="报表页尾"; Font myFont=new Font("roman",16); SolidBrush myBrush=new SolidBrush(Color.Red); myGraph.DrawString(strText, myFont, myBrush, 150,intY, new StringFormat()); //myGraph.Dispose(); } public void ProDrawPageHeader(System.Drawing.Printing.PrintPageEventArgs e) { if(e==null) return; Graphics myGraph=e.Graphics; string strText="报表页头"; Font myFont=new Font("roman",16); SolidBrush myBrush=new SolidBrush(Color.Red); myGraph.DrawString(strText, myFont, myBrush, e.MarginBounds.Width/2,70, new StringFormat()); //myGraph.Dispose(); }
public void ProDrawReportHeader(System.Drawing.Graphics myGraph,float intY) { if(myGraph==null) return; string strText="报表表尾"; Font myFont=new Font("roman",20); SolidBrush myBrush=new SolidBrush(Color.Blue); myGraph.DrawString(strText, myFont, myBrush, 250,intY, new StringFormat()); //myGraph.Dispose(); } public void ProDrawReportHeader(System.Drawing.Printing.PrintPageEventArgs e,int intP) { if(e==null) return; Graphics myGraph=e.Graphics; string strText="报表表头 Page:"+intP.ToString(); Font myFont=new Font("roman",20); SolidBrush myBrush=new SolidBrush(Color.Blue); myGraph.DrawString(strText, myFont, myBrush, e.MarginBounds.Width/2,20, new StringFormat()); Pen myPen=new Pen(Color.Brown,2); myGraph.DrawLine(myPen,e.MarginBounds.X,60,e.MarginBounds.Width,60); //myGraph.Dispose(); }
public float ProDrawDetailGroup(System.Drawing.Graphics myGraph,System.Drawing.Printing.PrintPageEventArgs e,DataTable myTable,DataTable myTable2) { if(myGraph==null) return -1; float linesPerPage = 0; //页面的行号 float yPosition = 0; //绘制字符串的纵向位置 int count = 0; //行计数器 float leftMargin = e.MarginBounds.Left; //左边距 float topMargin = e.MarginBounds.Top; //上边距 string line = null; //行字符串 Font printFont =new Font("Roman",12); SolidBrush myBrush = new SolidBrush(Color.Black);//刷子 linesPerPage = e.MarginBounds.Height / printFont.GetHeight(myGraph)-4;//每页可打印的行数 System.Drawing.Pen myPen=new Pen(myBrush); //myGraph.DrawRectangle(myPen,leftMargin,topMargin,e.MarginBounds.Width,e.MarginBounds.Height); while(count < linesPerPage && this.intnowrow<myTable.Rows.Count) { yPosition = topMargin + (count * printFont.GetHeight(myGraph))+60; leftMargin=e.MarginBounds.X; printFont=new Font("Roman",12,FontStyle.Bold); for(int k=0;k<myTable.Columns.Count-1;k++) { line=myTable.Rows[this.intnowrow]["c"+k.ToString()].ToString(); myGraph.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat()); leftMargin=leftMargin+160; } //测试附加id line=myTable.Rows[this.intnowrow]["id"].ToString(); myGraph.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat()); leftMargin=leftMargin+160; leftMargin=e.MarginBounds.Left; myGraph.DrawLine(myPen,leftMargin,yPosition+2,e.MarginBounds.Width,yPosition+2); count++; line=""; //打印副表 DataView myView=myTable2.DefaultView; string strRo="id2='"+myTable.Rows[this.intnowrow]["id"].ToString()+"'"; myView.RowFilter=strRo; printFont =new Font("Roman",12); for(int ss=0;ss<myView.Count;ss++) { leftMargin=e.MarginBounds.X; yPosition = topMargin + (count * printFont.GetHeight(myGraph))+60; for(int j=0;j<myTable2.Columns.Count-1;j++) { line=myView["c2"+j.ToString()].ToString(); myGraph.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat()); leftMargin=leftMargin+160; } line=myView["id2"].ToString(); myGraph.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat()); leftMargin=leftMargin+160; count++; this.intnowrow2++; } //结束打印副表 this.intnowrow=this.intnowrow+1; //父表记录加一 } //结束 myPen.Color=Color.PaleGreen; myGraph.DrawLine(myPen,leftMargin,yPosition+2,e.MarginBounds.Width,yPosition+2); //最后一横线 myPen.Color=Color.DarkTurquoise; myGraph.DrawLine(myPen,e.MarginBounds.Left,e.MarginBounds.Top,e.MarginBounds.Left,e.MarginBounds.Height); myGraph.DrawLine(myPen,e.MarginBounds.Left+160,e.MarginBounds.Top,e.MarginBounds.Left+160,e.MarginBounds.Height); myGraph.DrawLine(myPen,e.MarginBounds.Left+320,e.MarginBounds.Top,e.MarginBounds.Left+320,e.MarginBounds.Height); return yPosition; }
相关文章推荐
- Xamarin体验:使用C#开发iOS/Android应用(此文章为收藏博客,不是个人经验) by----作者:囧月 出处:http://lwme.cnblogs.com/
- 关于C#WinForm的datagridview控件的使用经验及技巧收集(持续更新)
- 整理完成了C# WinForm开发系列 - Report文章收藏
- 借鉴 C# 关于 LINQ 的设计思想用 C++ 11 来实现 LINQ to Object
- 个人小经验 ---关于PCB板设计1
- c#Winform程序调用app.config文件配置数据库连接字符串 SQL Server文章目录 浅谈SQL Server中统计对于查询的影响 有关索引的DMV SQL Server中的执行引擎入门 【译】表变量和临时表的比较 对于表列数据类型选择的一点思考 SQL Server复制入门(一)----复制简介 操作系统中的进程与线程
- 关于大型页游后端管理系统的一点经验和个人见解
- 关于背单词的一点个人体会 (好文章)
- 关于大型页游后端管理系统的一点经验和个人见解
- 两年网页设计的经验总结,给新手设计师一点个人建议
- [收藏].net关于企业Excel报表的生成
- 【收藏】C# WinForm开发系列 - DataGridView 使用方法集锦 - 宁波.Net技术讨论区
- SCI写作经验交流,别人的经验借鉴下,很有用的!
- 商业智能 别人家文章收藏
- 关于个人职业发展的一点考虑
- 知乎文章收藏-发展经验
- 很好的一篇关于C#事件与委托的文章
- 关于SQLite数据库的一点小经验
- 如何找实习单位(个人的一点经验)
- 在winForm下,c#实现出勤系统的客户端(基础类的设计)