从 ASP.NET (C#) 程序化地向 Crystal Reports 传递参数 - 第 1 部分






2.88/5 (5投票s)
如何从 ASP.NET 使用 C# 程序化地向 Crystal Reports 传递参数
引言
本文将指导您如何程序化地将参数传递到 Crystal Reports 报告,并在 .aspx 页面中显示该报告。它还将展示如何创建一个非嵌入式缓存报告。本文还旨在帮助您动态地从 Crystal Reports 文件中检索参数,并根据其类型在您的网页上放置自定义控件。
背景
在本文中,我假设您熟悉创建 Crystal Reports 文件,并且已经创建了一些带有参数的 .rpt 文件。我们将在此创建的页面将根据报告的参数数量从 rpt 文件中动态地收集参数,然后在页面上放置一个提交按钮,该按钮将传递所有参数到报告并显示它。
Using the Code
该项目包含两个 ASPX 页面
- Default.aspx - 此页面包含报告列表,从中启动报告。
- ReportView.aspx - 此页面将执行三个主要任务
- 创建非嵌入式缓存报告。
- 从缓存报告中检索参数,并用自定义控件替换 Crystal Reports 内置参数。
- 提交并显示报告本身(当然,这包括将参数传递给 Crystal Reports)。
Default.aspx 代码隐藏
基本上,有两种方法可以显示和启动选定的报告
public void ShowReportList(int menu_id)
{
// Show reports in a GridView webcontrol
// The source comes from an SQL2005 database
DataSet DS;
string connString =
System.Configuration.ConfigurationSettings.
AppSettings["userreader"].ToString();
DS = SqlHelper.ExecuteDataset(connString, CommandType.StoredProcedure,
"usp_get_submenuitems",
new SqlParameter("@menu_id", menu_id));
GridView1.DataSource = DS.Tables[0].DefaultView;
GridView1.DataBind();
}
protected void GridView1_RowCommand(object sender,
GridViewCommandEventArgs e)
{
// A session will be set to identity the selected report
// and open the ReportView.aspx in a new window
int index = Convert.ToInt32(e.CommandArgument);
GridViewRow selectedRow = ((GridView)e.CommandSource).Rows[index];
Session.Clear();
Session["name"] = selectedRow.Cells[0].Text;
if (e.CommandName == "Preview")
{
Response.Write("<script>");
Response.Write("window.open('../ReportView.aspx?time=" +
DateTime.Now.ToBinary() + "','_blank')");
Response.Write("</script>");
}
}
ReportView.aspx
以下是 ReportView
类的快速概述
public partial class ReportView : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)[...]
private void Page_Init(object sender, EventArgs e)[...]
private void InitCrystalReport()[...]
private void InitCrystalReportParameters()[...]
private void AddDateTimeFilter(CrystalDecisions.Shared.ParameterField param)[...]
private void AddMultiSelectFilter(CrystalDecisions.Shared.ParameterField param)[...]
private void AddStringFilter(CrystalDecisions.Shared.ParameterField param)[...]
private void AddSubmitButton()[...]
protected void Submit_Click(object sender, EventArgs e)[...]
}
页面从三个初始化步骤开始
public partial class ReportView : System.Web.UI.Page
{
private CachedReport cachedReportSource;
private CrystalDecisions.Web.CrystalReportViewer myViewer;
private string report_file = "";
private ParamType filters = new ParamType();
private void Page_Init(object sender, EventArgs e)
{
InitCrystalReport();
if (myViewer.ParameterFieldInfo.Count > 0)
{
InitCrystalReportParameters();
AddSubmitButton();
}
}
private void InitCrystalReport()
{
SqlDataReader rdr = null;
try
{
// Create cached report
myViewer = null;
cachedReportSource = null;
myViewer = new CrystalDecisions.Web.CrystalReportViewer();
myViewer.EnableParameterPrompt = false;
myViewer.HasCrystalLogo = false;
myViewer.Visible = false;
string connString = System.Configuration.
ConfigurationSettings.
AppSettings["userreader"].ToString();
rdr = SqlHelper.ExecuteReader(connString,
CommandType.StoredProcedure,
"usp_get_report_details",
new SqlParameter("@name",
Session["name"].ToString()));
while (rdr.Read())
{
report_file = (string)rdr["crystal_report_file"];
}
report_file = System.Configuration.ConfigurationSettings.
AppSettings["root"].ToString() + report_file;
cachedReportSource = new CachedReport(report_file);
myViewer.ReportSource = cachedReportSource;
contentMain.Controls.Add(myViewer);
}
catch
{
throw;
}
}
private void InitCrystalReportParameters()
{
// Prepare parameters
for (int i = 0; i < myViewer.ParameterFieldInfo.Count; i++)
{
switch (myViewer.ParameterFieldInfo[i].ParameterValueType.ToString())
{
case "DateTimeParameter":
AddDateTimeFilter(myViewer.ParameterFieldInfo[i]);
break;
case "StringParameter":
if (myViewer.ParameterFieldInfo[i].DefaultValues.Count > 0)
{
AddMultiSelectFilter(myViewer.ParameterFieldInfo[i]);
}
else
{
AddStringFilter(myViewer.ParameterFieldInfo[i]);
}
break;
}
}
}
}
cachedReportSource
变量是从一个 CachedReport
类创建的,该类如下所示
public class CachedReport : ICachedReport
{
private string reportFileName;
private ReportDocument nonEmbeddedReportDocument;
public CachedReport(string reportFileName)
{
this.reportFileName = reportFileName;
}
public virtual ReportDocument CreateReport()
{
if (nonEmbeddedReportDocument == null)
{
nonEmbeddedReportDocument = new ReportDocument();
nonEmbeddedReportDocument.Load(reportFileName);
}
return nonEmbeddedReportDocument;
}
public virtual String
GetCustomizedCacheKey(RequestContext request)
{return null;}
public virtual Boolean IsCacheable
{
get {return true;}
set {}
}
public virtual Boolean ShareDBLogonInfo
{
get {return false;}
set {}
}
public virtual TimeSpan CacheTimeOut
{
get {return CachedReportConstants.DEFAULT_TIMEOUT;}
set {}
}
}
其余代码如下
private void AddDateTimeFilter(CrystalDecisions.Shared.ParameterField param)
{
try
{
Label myLabel = new Label();
TextBox myTextBox = new TextBox();
TableCell tc1 = new TableCell();
TableCell tc2 = new TableCell();
myLabel.Text = param.PromptText + ": ";
myTextBox.ID = "text" + param.PromptText;
myTextBox.ToolTip = param.PromptText;
string calendarSetup = System.Configuration.
ConfigurationSettings.AppSettings["calendarsetup"].
ToString().Replace("mytext", myTextBox.ID);
myTextBox.Attributes.Add("onclick", calendarSetup);
tc1.Controls.Add(myLabel);
tc2.Controls.Add(myTextBox);
contentFilter1.Controls.Add(tc1);
contentFilter2.Controls.Add(tc2);
filters.AddDateTimeFilter(myTextBox);
}
catch
{
throw;
}
}
private void AddMultiSelectFilter(CrystalDecisions.Shared.ParameterField param)
{
const int width = 150;
try
{
Label myLabel = new Label();
xMilk.DropCheck myDropCheck = new xMilk.DropCheck();
TableCell tc1 = new TableCell();
TableCell tc2 = new TableCell();
myLabel.Text = param.PromptText + ": ";
myDropCheck.Width = width;
for (int i = 0; i < param.DefaultValues.Count; i++)
{
ParameterDiscreteValue paramDV = new ParameterDiscreteValue();
paramDV = (ParameterDiscreteValue)param.DefaultValues[i];
ListItem myItem = new ListItem(paramDV.Value.ToString());
myDropCheck.Items.Add(myItem);
}
tc1.Controls.Add(myLabel);
tc2.Controls.Add(myDropCheck);
contentFilter1.Controls.Add(tc1);
contentFilter2.Controls.Add(tc2);
filters.AddMultiSelectFilter(myDropCheck);
}
catch
{
throw;
}
}
private void AddStringFilter(CrystalDecisions.Shared.ParameterField param)
{
const int width = 150;
try
{
Label myLabel = new Label();
TextBox myTextBox = new TextBox();
TableCell tc1 = new TableCell();
TableCell tc2 = new TableCell();
myLabel.Text = param.PromptText + ": ";
myTextBox.Width = width;
tc1.Controls.Add(myLabel);
tc2.Controls.Add(myTextBox);
contentFilter1.Controls.Add(tc1);
contentFilter2.Controls.Add(tc2);
filters.AddStringFilter(myTextBox);
}
catch
{
throw;
}
}
private void AddSubmitButton()
{
try
{
Button submit = new Button();
TableCell tc1 = new TableCell();
submit.Text = "Submit";
tc1.Controls.Add(submit);
contentFilter1.Controls.Add(tc1);
submit.Click += new System.EventHandler(this.Submit_Click);
}
catch
{
throw;
}
}
protected void Submit_Click(object sender, EventArgs e)
{
for (int i = 0; i < myViewer.ParameterFieldInfo.Count; i++)
{
ParameterDiscreteValue objDiscreteValue =
new ParameterDiscreteValue();
ParameterField objParameterField = new ParameterField();
string value = filters.GetParamTextByIndex(i);
string filterType = filters.GetParamTypeByIndex(i);
if (value != "")
{
switch (filterType)
{
case FilterType.DateTime:
value += " 12:00";
objDiscreteValue.Value = DateTime.ParseExact(value,
"yyyy-MM-dd HH:mm", null);
break;
case FilterType.MultiSelect:
objDiscreteValue.Value = value;
break;
case FilterType.String:
objDiscreteValue.Value = value;
break;
}
}
else
{
objDiscreteValue.Value = null;
}
objParameterField = myViewer.ParameterFieldInfo[i];
objParameterField.CurrentValues.Add(objDiscreteValue);
myViewer.ParameterFieldInfo.RemoveAt(i);
myViewer.ParameterFieldInfo.Insert(i, objParameterField);
}
myViewer.Visible = true;
}
本文的第二部分可以在这里找到。