65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.88/5 (5投票s)

2010年2月25日

CPOL

1分钟阅读

viewsIcon

55062

如何从 ASP.NET 使用 C# 程序化地向 Crystal Reports 传递参数

引言

本文将指导您如何程序化地将参数传递到 Crystal Reports 报告,并在 .aspx 页面中显示该报告。它还将展示如何创建一个非嵌入式缓存报告。本文还旨在帮助您动态地从 Crystal Reports 文件中检索参数,并根据其类型在您的网页上放置自定义控件。

背景

在本文中,我假设您熟悉创建 Crystal Reports 文件,并且已经创建了一些带有参数的 .rpt 文件。我们将在此创建的页面将根据报告的参数数量从 rpt 文件中动态地收集参数,然后在页面上放置一个提交按钮,该按钮将传递所有参数到报告并显示它。

Using the Code

该项目包含两个 ASPX 页面

  1. Default.aspx - 此页面包含报告列表,从中启动报告。
  2. 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;
}

本文的第二部分可以在这里找到。

© . All rights reserved.