【水晶报表内功心法】-第一阶段小结,该 发布时间: 2013-01-26 13:47:01 作者: rapoo
【水晶报表内功心法】--第一阶段小结 本帖最后由 babyt 于 2010-03-31 17:30:25 编辑 索引 .【水晶报表内功心法】--序言 .【水晶报表内功心法】--推拉之间 .【水晶报表内功心法】--PULL模式样板招式 .【水晶报表内功心法】--PUSH模式样板招式 .【水晶报表内功心法】--信手拈来,掌控对象 .【水晶报表内功心法】--数据过滤 ... ... .【水晶报表内功心法】--完美Excel(上) .【水晶报表内功心法】--完美Excel(下) ============================================================ 今天数据库狂慢,数据库服务器是百万大元的超强机器,还是被折腾得半死不活的。刚好有点时间,写一下这篇。 本文是第一阶段的小结,第一阶段主要讲解了推拉模式,以及基本操作,和数据的过滤。它的主要目的就是解决怎么把数据与报表的交互问题。 前后历时近一月,反响一如我当初所料,不会很强烈。而且很多人,也是因为推荐到首页后,习惯性的顶一下。并没有认真的去看内容。 毕竟水晶报表的应用范围比较小。不过我也很高兴能看到几位朋友,能真正的去看了,还参与了讨论。 我本来的目的,就是为了系统地介绍水晶报表的应用,一来是方便大家在用到的时候查阅和学习,二来也能减少自己的重复回复。 下一阶段,则主要讲解报表在拿到数据后的进一步处理。 大致会分为以下几个章节: 参数、函数与公式、运行时总计 分组 子报表 交叉表 图表 仍然是讲解基本概念和应用技巧以及应用场景,这些讲完,也基本完成了整个报表功能的基本介绍了。这些预计在7月份完成。 有时间的话,我会零散讲一下水晶易表(水晶报表的兄弟产品)的应用,看一下这个工具的酷炫效果。1:PULL模式和PUSH模式的选择 PULL执行效率高,开发简单,适用于WinForm程序,用户不是很多的系统。 但是多了一个数据库连接,而且这个链接的占用时间还比较长,所以不适合用户多的系统。 有一种特例,就是数据量特别大的情况,我推荐用PULL。 PUSH则很灵活,可以承接任何数据源。比如不是从数据库里直接出来的数据,或者是来自于WebService等其他应用的数据接口。2:WebForm开发的一个重要技巧:小代码,大作用 在前面的文章中,我一直是用WebForm演示的,主要是因为 HTTP是无状态的,在此链接的操作,不会带到下一连接中。 所以我们经常会遇到这样的情况,当前显示好的,在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。 这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。 所以之前的代码,我一直是写在Page_load里的,但是这样一是不能解决所有的问题,特别是涉及到有参数传递等情况。 二是可能会多次请求数据库,导致资源的消耗。 前面说到既然是状态丢失,那么我们可以用.Net里的session,cache或viewstate来进行保持状态。 这里我用session做一个范例,场景是这样的: 一个PUSH模式的报表,带一个参数p1. 界面上有一个Button,点击后展现报表。然后报表可以进行翻页、打印和导出(这些是工具条实现的,不进行编码实现)而不会出现错误提示。 其实只要改造两处地方即可,注意红色的部分。 public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { //使用Session保持ReportDocument对像 //每次页面更新时,不再需要重新走数据库 //注意:如果是VS2008,这段代码要放到Page_Init事件中 If (Session["myRpt"]!=null) then { CrystalReportViewer1.ReportSource = (ReportDocument)Session["myRpt"]; } } //点击按钮后,报表进行第一次呈现 protected void Button1_Click(object sender, EventArgs e) { //连接字串 String connstr = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=E:\CrZen\testall.mdb;"; OleDbDataAdapter da = new OleDbDataAdapter(); OleDbConnection cn = new OleDbConnection(connstr); da = new OleDbDataAdapter("SELECT * From RPT_CR_TEST1", cn); DataSet2 dt1 = new DataSet2(); da.Fill(dt1, "RPT_CR_TEST1"); ReportDocument myReport = new ReportDocument();
string reportPath = Server.MapPath("crystalreport1.rpt"); myReport.Load(reportPath); //绑定数据集,注意,一个报表用一个数据集。 myReport.SetDataSource(dt1.Tables[0]); myReport.SetParameterValue("p1","参数测试"); CrystalReportViewer1.ReportSource = myReport; //保存到Session Session["myRpt"]=myReport; } } 本文将持续更新一段时间。[解决办法] 呵呵[解决办法] 占楼了...真有心.[解决办法] 辛苦了,回头搞成书的话,整一本,给你寄去,搞个签名,呵呵。[解决办法] 期待![解决办法] 支持[解决办法] 怎么又加分了?[解决办法] [解决办法]
[解决办法] 问个问题: 用arraylist做数据源的例子怎么样那? 还有其他格式的数据源吗?[解决办法] 专业但是看不懂[解决办法] 虽然看不懂,但是楼主很朴实[解决办法] 学习[解决办法] 学习来的哦,呵呵……好强哦[解决办法] 谢谢LZ 收藏了[解决办法] 没看明白 这是干什么用的------解决方案--------------------
喜欢这种总结[解决办法] 我将持续学习[解决办法] 学习[解决办法] 我很早就听说水晶报表了,看一直没时间学习研究 现在工作要用到,临时抱抱 谢谢楼主了[解决办法] testtesttetstetetetetsxtstret[解决办法] 关注中.............[解决办法] 关注中.............[解决办法] ......[解决办法] 阿泰,你出书吧,我想买[解决办法] 我现在要研究的是把文件中的数据读出来绑定到水晶报表中,不是数据库哦 汗[解决办法] +[解决办法] 引用: 问个问题: 用arraylist做数据源的例子怎么样那? 还有其他格式的数据源吗? 我试了试, 用Push模式,新建数据源dataset,里面列名为Column1,Column2 然后加到报表上面。 后台代码,定义一个struct类Spublic struct S { public DateTime Column1; public int Column2; } 里面包含两个属性,名称为Column1,Column2 然后数据源的话,可以如下获取arrayArrayList array = new ArrayList(); System.Random rd = new Random(); for (int i = 0; i < 200; i++) { S s; t.Column1 = new DateTime(rd.Next(2000, 2010), rd.Next(1, 12), rd.Next(1, 28)); t.Column2 = rd.Next(100); array.Add(t); } return array; 然后指定数据源给报表就可以了,不用dataset,但是设计界面下是要dataset, 我这样运行是可以的 不止是否就是泰兄说的arraylist做数据源的本意?[解决办法] 引用: 再回复一次吧 :0 不一样的。arrayList也只是其中一种, 实质上用的是数据源里面,"项目数据"里的 ".Net Objects",简单点说,就是一个类(相当于一个数据库或者是dataset) 有一个和多个可以返回数据的方法(这个方法就类似于表了)。当然不是所有的类和方法都适用。 当然,用dataset做报表,传arraylist进去做数据源,也是完全可以的。并不一定非要ds. 有这方面的例子参考吗 链接也许。[解决办法] 又试了下 是这样吗 类文件using System; using System.Data; using System.Configuration; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using System.Collections; /// <summary> /// Class1 的摘要说明 /// </summary> public class Class1 { public Class1() { // // TODO: 在此处添加构造函数逻辑 // } public ArrayList GetArray() { ArrayList array = new ArrayList(); System.Random rd = new Random(); for (int i = 0; i < 200; i++) { S s; s.Column1 = new DateTime(rd.Next(2000, 2010), rd.Next(1, 12), rd.Next(1, 28)); s.Column2 = rd.Next(100); array.Add(s); } return array; } public DataTable GetDataTable() { DataTable dt = new DataTable(); dt.Columns.Add("Column1", typeof(DateTime)); dt.Columns.Add("Column2", typeof(int)); System.Random rd = new Random(); for (int i = 0; i < 200; i++) { DataRow dr = dt.NewRow(); dr["Column1"] = new DateTime(rd.Next(2000, 2010), rd.Next(1, 12), rd.Next(1, 28)); dr["Column2"] = rd.Next(100); dt.Rows.Add(dr); } return dt; } public DateTime Column1; public int Column2; } public struct S { public DateTime Column1; public int Column2; }
主画面protected void Page_Load(object sender, EventArgs e) { Class1 c = new Class1(); this.CrystalReportSource1.ReportDocument.SetDataSource(c.GetDataTable()); //this.CrystalReportSource1.ReportDocument.SetDataSource(c.GetArray()); } [解决办法] 引用: 我本来还想自己写来这,不过刚找到这篇,写得很详尽,做教程已经非常完美了。 http://tech.sina.com.cn/s/2006-06-19/0909995838.shtml 我看看[解决办法] 引用: 引用: 我本来还想自己写来这,不过刚找到这篇,写得很详尽,做教程已经非常完美了。 http://tech.sina.com.cn/s/2006-06-19/0909995838.shtml 我看看 看完了, 恩,是很详细,不过没图,看着很费力,
[解决办法] 感觉还不错,谢谢分享![解决办法] 学习[解决办法] 最近在做CR,碰到了个问题,来这边发了下帖被啊泰解决了,呵呵 后来我身边的人都知道啊泰.大拿~~~~~~~~~~LZ整理辛苦了,JF[解决办法] 回帖是一种美德![解决办法] 还不错啊 我们以前也学了[解决办法] 很不错.收藏了[解决办法] lz很强..... 在jquery论坛看到lz在csdn也看到你,真的崇拜你啊,要不收我做学生得了.....[解决办法] mark[解决办法] up[解决办法] 收藏了[解决办法] 那也就是说,加红色字的语句也可以解决点击水晶报表预览画面的刷新按钮,报表数据丢失的问题了?[解决办法] 收藏了再说[解决办法] 值得学习[解决办法] 泰哥写本书吧[解决办法] 写本书发出来吧[解决办法] 我再顶[解决办法] 做个记号,慢慢拜读。 [解决办法] 收藏了~~~~谢楼主[解决办法] 看得不是太明白[解决办法] 收藏之!!