水晶报表
我们先来看看在ASP.NET中使用水晶报表需要哪些组件:CrystalReportViewer,CrystalReportSource及以
rpt为扩展名的报表文件。
我们可以将以上组件拿来与数据绑定控件,数据源控件来做一个类比:
CrystalReportViewer就相当于数据绑定控件,用来显示最后的报表。
CrystalReportSource就相当于数据源控件,但不是直接在它身上直接配置数据源,而是通过rpt报表文件。
在页面上拖入上述俩控件就会自动引入CrystalDecisions.Web
rpt报表文件,创建该文件后就可以在报表设计器中配置数据源了,创建该文件后就会自动引入
CrystalDecisions.CrystalReports.Engine,CrystalDecisions.Enterprise.Framework,CrystalDecision
s.Enterprise.InfoStore,CrystalDecisions.Shared
使用水晶报表有两种模式:
1.PULL模式(拉模式)
被请求时,水晶报表直接根据指定的驱动连接数据库然后组装这些数据。
创建rpt报表文件后,在VS左侧就会出现"字段资源管理器",在"字段资源管理器"中右键"数据库专家"->"创
建新连接"->然后将你选的数据库里的表添加进来。
2.PUSH模式(推模式)
参考:
http://www.cnblogs.com/xumingming/archive/2008/07/31/1257106.html
http://blog.csdn.net/chuxue1342/article/details/1935948
http://dotnet.chinaitlab.com/ASPNET/530751.html
http://topic.csdn.net/u/20090626/17/8090bf70-bed9-41ac-9e09-c0a6a7ab4cb8.html?59922
RDLC报表
虽然水晶报表功能很强大,但由于其使用过于复杂并且需要付费,RDLC报表的优势凸显出来:微软自家的东西,使用简单,功能也很好。
首先创建RDLC报表文件(后缀名是.rdlc),之后VS左侧就会出现"网站数据源",而且你打开工具箱看看,会发现工具箱里都是些"文本框"、"表"、"折线图"、"矩阵"等。在"网站数据源"上添加新数据源(该过程会创建一个dataset文件,你可以在设计器里拖入你想要显示的表),或者你随便创建一个dataset文件都会在"网站数据源"内显示。rdlc报表文件实际上是一个XML文件,可以用记事本打开看看。
之后你就可以在"网站数据源"的dataset里拖动我们想要的字段到rdlc报表里了。
添加reportviewer控件:在.NET Framework组件选项卡下选中命名空间为Microsoft.Reporting.WebForm下的ReportViewer。
然后在reportviewer控件的任务列表里选择刚才建立的rdlc报表文件,这时VS会根据你的rdlc报表文件生成相应的ObjectDataSource来为其提供数据,注意有时会出现 未能找到在 ObjectDataSourc的 TypeName 属性中指定的类型 的错误 不知是为什么这是其TypeName的命名空间不对(可能是不全或其他原因),所以还是人工查找该TypeName指向的类的完全命名空间吧。
运行后貌似对chrome浏览器不是很支持,添加的字段都挤在一起了。
向报表添加报表项(表,矩阵等。在下面链接中被称为"数据区域")
http://msdn.microsoft.com/zh-cn/library/ms252086(v=vs.80).aspx
表数据区域 http://msdn.microsoft.com/zh-cn/library/ms251659(v=vs.80).aspx
矩阵数据区域 http://msdn.microsoft.com/zh-cn/library/ms251709(v=vs.80).aspx
http://www.cnblogs.com/Gerry-BJ/archive/2008/05/13/1195450.html
列表数据区域 http://msdn.microsoft.com/zh-cn/library/ms251742(v=vs.80).aspx
图表 http://msdn.microsoft.com/zh-cn/library/ms252128(v=vs.80).aspx
在将图表添加到报表时,需要将某些字段拖到某些位置:
数据字段(通常的Y轴,代表"值",如多少分数 或 多少销售量)
类别字段(通常的X轴,代表"谁",如某同学 或 某公司)
序列字段(如果"谁"只有一个"值"就无所谓了,但如果有多个"值"(如多门课 或 多季度),如果不指定序列字段就会将"谁"的这些"值"全加在一处 如果指定了 就很清晰(如小明语文多少分数学多少分 或 某公司第一季度销售量是多少第二季度销售量是多少))
RDLC表达式 http://www.cnblogs.com/jack86514/archive/2009/10/17/1585254.html
http://www.cnblogs.com/hubcarl/archive/2009/10/08/1579029.html
有时可能需要使用联合查询得到的数据源,可以在上面建立的dataset文件中右键"添加"->"TableAdapter"然后在查询生成器里使用联合查询的语句。这时别忘了为reportviewer控件重新根据你的rdlc报表文件生成相应的ObjectDataSource。
但是如果按照上面的方法生成报表的话,我们就很难与之有个交互性,这就需要使用RDLC报表自定义数据集了http://www.cnblogs.com/luozhanbin/archive/2008/07/13/1241991.html
代码很简单,但有几点要说
protected void Button1_Click(object sender, EventArgs e)
{
SqlConnection conn = new SqlConnection(@"Data Source=.\sqlexpress;Initial
Catalog=GA_ONLINEEXAM.MDF;Integrated Security=True");
SqlCommand cmd = new SqlCommand("select st.sname,sc.thescore from student
st,score sc where sc.sid=st.id and paperid=@paperid", conn);
cmd.Parameters.AddWithValue("paperid", TextBox1.Text); 此处有个交互性
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
DataSet ds = new DataSet();
da.Fill(ds);
conn.Close(); 设置报表文件,要用物理路径
this.ReportViewer2.LocalReport.ReportPath = Server.MapPath("Report2.rdlc");
ReportViewer2.LocalReport.DataSources.Clear(); 清空原先的数据源
ReportDataSource rds = new ReportDataSource(); 新的数据源类 using Microsoft.Reporting.WebForms
此处名字要注意,它是数据集里的一个表名,自动命名就是数据集名_表名(这个可以通过切换到rdlc报表文件界面-菜单栏-报表-数据源 里查看和重命名)
rds.Name = "DataSet1_DataTable1";
rds.Value = ds.Tables[0];
ReportViewer2.LocalReport.DataSources.Add(rds); 添加新数据源
ReportViewer2.LocalReport.Refresh(); 刷新显示报表
}
但有个问题,我们如何控制报表的样式格式呢?所以我们之前其实还是要通过建立数据源(按照此处的话有个表名是DataSet1_DataTable1)然后把我们想要的字段拖到报表设计器中来设置样式格式的,只不过我们在真正用时不是使用这个数据源,而是使用程序中创建的数据源,所以我们自定义的数据集中也必须出现我们在报表设计器中拖动的字段,否则会出错。
参考:
http://wangjierui.blog.51cto.com/186879/39772
http://www.cnblogs.com/waxdoll/archive/2006/02/27/339115.html
http://blog.csdn.net/huc87/article/details/4021080
http://www.cnblogs.com/jack86514/category/204494.html