ReportDocument rd = new ReportDocument();
rd.Load(Server.MapPath("~/Reports/CR_PrintPurchase.rpt"));
rd.SetDataSource(Common.Tool.ToDataTable<Model.view_purchase>(listPurchaseOrderDetail));
rd.Subreports[0].SetDataSource(CreateData(Session["printPurchaseOrder"].ToString()));
CrystalReportViewer1.ReportSource = rd;
如果report创建时用的是数据库stored procedure 或者是 query, 你应该传入数据库的server name, database name, user, password, 这样report可以去数据库取数据。
而如果你想直接把数据传给report, 那么report创建时数据源应该选ADO.NET dataset.
是子报表的问题,使用了XML数据源,路径写死了,换台机器就会路径不对,应该使用xsd文件配置xml数据源,使用Server.Mappath
参考:http://blog.csdn.net/babyt/article/details/4610054
以下为该页面原内容
--------------------------------------------------------------------------
我们经常会遇到这样的情况,当前显示好的,在翻页、导出、打印等动作的时候,出出现无数据,或者需要重新登陆数据库的提示。
这是因为这些动作都重新触发了页面,导致我们前一次的操作丢失了。
所以之前的代码,我一直是写在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;
}
}