大家在使用水晶报表时是否发现,在自己制作的模板中点击分页与打印的工具栏都是可以的,但是把加载到程式中却无法分页与打印呢?
经过测试发现其实是因为分页是从第一次加载的数据做为数据源来分页的.所以程式中想要分页与打印可用必须要缓存数据,才可以.(此仅我个人的理解,
如果有人知道欢迎指导.)
参考代码如下:
写代码之前请先引用下面的命名空间
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
第一种如果你的资料已经固定.则可以直接在protected void Page_Init(object sender, EventArgs e)中定绑定资料即可.
protected void Page_Init(object sender, EventArgs e)
{
ReportDocument document = new ReportDocument();
// 加载报表
// document.Load(Server.MapPath("querySiteCrystalReport.rpt")); // 使用相对路径的方法
document.Load(@"D:\mywebform\CRReport\CRreportFirst\CRReport\WebApplication1\sa030.rpt");
//设置数据源
this.CrystalReportViewer1.ReportSource = document;
// 将参数字段集合放入查看器控件。
//this.CrystalReportViewer1.ParameterFieldInfo = paramFields;
//定义连接信息
TableLogOnInfo connectionInfo = new TableLogOnInfo();
connectionInfo.ConnectionInfo.ServerName = "1**.1*.3.6";
connectionInfo.ConnectionInfo.DatabaseName = "TEST";
connectionInfo.ConnectionInfo.UserID = "sa";
connectionInfo.ConnectionInfo.Password = "123";
应用连接设置
document.Database.Tables[0].ApplyLogOnInfo(connectionInfo);
//数据绑定
// CrystalReportViewer1.SelectionFormula = "{orderdate}=" + TextBox1.Text;
this.CrystalReportViewer1.DataBind();
// CrystalReportViewer1.RefreshReport();
// 声明将参数传递给查看器控件所需的变量。
ParameterFields paramFields = new ParameterFields();
//声明参数
ParameterField startDate = new ParameterField();
ParameterField endDate = new ParameterField();
//设置参数字段的名称,它必须和报表中的参数相符。
startDate.Name = "startDate";
//声明参数值
ParameterDiscreteValue VstartDate = new ParameterDiscreteValue();
//给参数赋值
VstartDate.Value = TextBox1.Text;
startDate.CurrentValues.Add(VstartDate);
// 将该参数添加到参数字段集合。
paramFields.Add(startDate);
this.CrystalReportViewer1.ParameterFieldInfo = paramFields;
}
第二种如果你的条件是变化,则不可以只写在Page_Init中否则你的资料可以不会变化.
public void Page_Load(object sender, EventArgs e)
{
//此處不寫則不能分頁|打印|導出
if (Cache["customerReport"] != null)
{
CrystalReportViewer1.ReportSource = Cache["customerReport"];
CrystalReportViewer1.DataBind();
}
}
protected void Button1_Click(object sender, EventArgs e)
{
ReportDocument document = new ReportDocument();
// 加载报表
// document.Load(Server.MapPath("querySiteCrystalReport.rpt")); // 使用相对路径的方法
document.Load(@"D:\mywebform\CRReport\CRreportFirst\CRReport\WebApplication1\sa030.rpt");
string selectFormula = "{sa030.orderdate} like '*" + TextBox1.Text + "*'";
//注意此处的LIKE查询与SQL的LIKE查询有点不一样啊,SQL中一般用%的匹配符,但是此处用*号,否则LIKE查询不出为数据啊!
document.DataDefinition.RecordSelectionFormula = selectFormula;
//设置数据源
this.CrystalReportViewer1.ReportSource = document;
// 将参数字段集合放入查看器控件。
//this.CrystalReportViewer1.ParameterFieldInfo = paramFields;
//定义连接信息
TableLogOnInfo connectionInfo = new TableLogOnInfo();
connectionInfo.ConnectionInfo.ServerName = "1**.1*.3.6";
connectionInfo.ConnectionInfo.DatabaseName = "TEST";
connectionInfo.ConnectionInfo.UserID = "sa";
connectionInfo.ConnectionInfo.Password = "123";
应用连接设置
document.Database.Tables[0].ApplyLogOnInfo(connectionInfo);
//数据绑定
// CrystalReportViewer1.SelectionFormula = "{orderdate}=" + TextBox1.Text;
this.CrystalReportViewer1.DataBind();
// CrystalReportViewer1.RefreshReport();
// 声明将参数传递给查看器控件所需的变量。
ParameterFields paramFields = new ParameterFields();
//声明参数
ParameterField startDate = new ParameterField();
ParameterField endDate = new ParameterField();
//设置参数字段的名称,它必须和报表中的参数相符。
startDate.Name = "startDate";
//声明参数值
ParameterDiscreteValue VstartDate = new ParameterDiscreteValue();
//给参数赋值
VstartDate.Value = TextBox1.Text;
startDate.CurrentValues.Add(VstartDate);
// 将该参数添加到参数字段集合。
paramFields.Add(startDate);
this.CrystalReportViewer1.ParameterFieldInfo = paramFields;
Cache["customerReport"] = document;
}
另外请注意赋值报表中的参数写的位置,否则参数值不会根据你写的变化而变化.