c#水晶报表总结
1,水晶报表从数据库中读取的数据,当字段内容比较长时,很影响美观,需要设置它为自动换行来显示。
2.打开字段的“设置对象格式”属性,将其“公用”标签下的“可以扩大属性选上,*该设置可以使边框自适应宽度
3.打开节专家,将详细资料中的“延伸到后续节”选中,如果有多个节点的话可以把多个节点全部选中;
4.将报表中线条控件的“设置对象格式”中“打印时扩展到节的底部”属性勾选上,这样线条也会根据每行的数据高度自动向下移动。
1,创建dataset.xsd 增加表,然后在表中增加若干列
2,增加水晶报表,画表格,将dataset中的列显示到水晶报表中,并增加参数,(p1.p2.p3.p4.p5)
3 通过代码将datatable转换为xml,dataset
using CrystalDecisions.CrystalReports.Engine; using DbHelper; using Productsys; using System; using System.Data; using System.Data.OleDb; using System.Windows.Forms; class clsDyCrystalReportCore { /// <summary> /// 将传入的datatable转换成报表模板所需要的datatable /// 数据全部转换为string /// </summary> /// <param name="dt">来源表</param> /// <returns>报表模板所需要的datatable</returns> public DataTable dtx(DataTable dt) { BigTable.TableModeDataTable dtx1 = new BigTable.TableModeDataTable(); object[] obj = new object[dt.Columns.Count]; //特别注意:所选择的表的列的数目需<=Bigtable的字段数目 //请自行填写保护代码 for (int i = 0; i < dt.Rows.Count; i++) { dtx1.Rows.Add(dtx1.NewRow()); for (int j = 0; j < dt.Columns.Count; j++) { dtx1.Rows[i][j] = dt.Rows[i][j].ToString(); } } return dtx1; } /// <summary> /// 获取ReportDocument /// 使用获取到的对象对Reportview设置 /// crystalReportViewer1.ReportSource = myReport; /// crystalReportViewer1.RefreshReport(); /// /// </summary> /// <param name="titile">表标题</param> /// <param name="dtSource">数据源</param> /// <returns></returns> public ReportDocument getReportSource(string titile, DataTable dtSource) { DataTable dt1 = dtSource; DataTable dtx = new DataTable(); //处理ds1 clsDyCrystalReportCore xCore = new clsDyCrystalReportCore(); dtx = xCore.dtx(dt1); ReportDocument myReport = new ReportDocument(); string reportPath = System.Threading.Thread.GetDomain().BaseDirectory + @"/Resource/TimeReport.rpt"; myReport.Load(reportPath); //绑定数据集,注意,一个报表用一个数据集。 myReport.SetDataSource(dtx); //获取列数 int cols = dt1.Columns.Count; if (cols >= 9) { //设置参数,即表头 for (int i = 1; i <= cols; i++) { if (i <= cols) //dt1.Columns[i-1].ColumnName myReport.SetParameterValue("p" + i.ToString(), dt1.Columns[i - 1].ColumnName); else //注意,这个不能省,一定要给没用到的参数一个空值 myReport.SetParameterValue("p" + i.ToString(), ""); } myReport.SetParameterValue("titile", titile); } else { for (int i = 1; i <= 9; i++) { if (i <= cols) //dt1.Columns[i-1].ColumnName myReport.SetParameterValue("p" + i.ToString(), dt1.Columns[i - 1].ColumnName); else //注意,这个不能省,一定要给没用到的参数一个空值 myReport.SetParameterValue("p" + i.ToString(), ""); } myReport.SetParameterValue("titile", titile); } return myReport; } }
//控件调用方法 clsDyCrystalReportCore cls = new clsDyCrystalReportCore(); ReportDocument rd = cls.getReportSource(reportname,source); crystalReportViewer1.ReportSource = rd;
以上方法是通过1个dataset.xsd来完成多个报表的打印,
下面是自己通过抽象工厂来做的一个调用多个模板的方法
//直接通过datatable显示到 crastalReportViewer1中 string sqlStr="SELECT * FROM USERINFO";
DataTable dt = DbHelper.DbHelperSQL.DataQuery(sqlStr).Tables[0];
ReportClass reportClass = ReportFactory.getInstance(reportname);
reportClass.SetDataSource(dt);// 设置数据源 crystalReportViewer1.ReportSource = reportClass;
using CrystalDecisions.CrystalReports.Engine; using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Productsys.Class { /// <summary> /// 使用工厂模式对报表进行初始化 /// </summary> class ReportFactory { private ReportFactory() {} public static ReportClass getInstance(string reportname) { return (ReportClass)Activator.CreateInstance(Type.GetType(reportname)); } } }
什么push和pull的分不清,反正就是一个通过xsd一个不通过xsd文件进行显示的。。。。。。