日期:2014-05-18  浏览次数:20902 次

C#给水晶报表数据源中的带参数的存储过程传值问题
(C# wform) 我做了一上水晶报表crydtalReport1,同时在报表专家中给水晶报表数据源用了一个数据库中带参数据的存储过程(这样为的是可以直接调整报表的样式).
将crydtalReport1邦定到crystalReportViewer1后.
运行crystalReportViewer1所在的窗体时,会弹出让手动输入缺省的参数.
但是我想直接在运行crystalReportViewer1所在的窗体时将一个预先定好的值,比如一个textbox里的值传给它.不知道如何做.
要在哪里将参数传进去?怎么传?
在这代码好好像是传参数的,但是看不明白在什么地方给参数值:
CrystalDecisions.Shared.ParameterFields paramFields = crystalReportViewer1.ParameterFieldInfo;
CrystalDecisions.Shared.ParameterField paramField = paramFields[];
CrystalDecisions.Shared.ParameterValues curValues = paramField.CurrentValues;
  CrystalDecisions.Shared.ParameterDiscreteValue discreteValue = new CrystalDecisions.Shared.ParameterDiscreteValue();
  discreteValue.Value = "";  
  curValues.Add(discreteValue);
  crystalReportViewer1.ParameterFieldInfo = paramField;
哪位高手帮一帮.


------解决方案--------------------
discreteValue.Value = this.textbox.text;
------解决方案--------------------
1.如果LZ只是想可以直接调整报表的样式可以使用推模式提取数据啊
(1)在项目里添加Dataset.cs(无需配置),在其中添加datatable1(自命名),为表添加列,
列名和你所要调用的存储过程所提取的数据列对应(一定),然后在水晶报表里就可以引用datatable1(表结构)设计报表的样式
(2)根据参数的不同,使用代码调用存储过程提取数据,把数据Fill()到datatable1(临时表,和(1)中的重名),可以根据需要动态的赋给报表对象
c#代码:
crydtalReport1 cr1= new crydtalReport1();
cr1.setDataSource(datatable1);//datatable1为临时表
crystalReportViewer1.reportSource= cr1;
2.直接调用带参数的存储过程也很简单啊

解决参数的赋值问题
添加应用:
using CrystalDecisions.ReportSource;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;

表单的Load事件代码:

CrystalReport1 cr1 = new CrystalReport1();
cr1.SetParameterValue("@aa", textbox.text);
//@aa 为存储过程的参数名,视过程的参数的数据类型需对textbox.text进行相应的转换
//也可以根据需要添加对多个参数,当参数的值动态改变时可以重新载入报表
crystalReportViewer1.ReportSource = cr1;
------解决方案--------------------
mark