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文件进行显示的。。。。。。