使用 Crystal Report 时如何阻止“输入参数值”对话框弹出






3.42/5 (7投票s)
本文包含代码,用于防止为每个 SQL 存储过程参数弹出“输入参数值”对话框,并带有动态数据库。
引言
当使用 Crystal Report 与 SQL 存储过程参数时,如果不想为动态数据库的每个存储过程参数都弹出“输入参数值”对话框,并希望动态传递这些参数时,本文可能会有所帮助。
背景
Crystal Report 使用 SQL 存储过程时,无论是在加载时还是在使用刷新按钮点击或使用 CrystalReportViewer
类的 RefreshReport()
方法刷新报告时,都会始终弹出参数值对话框。然而,当你想动态传递参数值并避免弹出窗口时,由于即使在加载时也会传递参数,因此没有办法做到这一点。在刷新报告时,所有参数都会被解绑,并且再次为每个参数弹出窗口。因此,在刷新时,所有参数都会被解绑,并且没有其他方法在刷新时重新绑定它们,这似乎非常荒谬。
所以,在这里我尽力解决我曾经遇到的问题。
Using the Code
首先设置动态数据库连接信息
//Connection info object
private ConnectionInfo objConnectionInfo;
objConnectionInfo = new ConnectionInfo();
objConnectionInfo.ServerName = "ServerName";
objConnectionInfo.DatabaseName = "DBName";
objConnectionInfo.UserID = "UserId";
objConnectionInfo.Password = "Password";
现在,为报告中的每个表设置数据库信息
//Set dynamic database connection information
Tables tables = ((ReportClass)crystalReportViewer1.ReportSource).Database.Tables;
foreach (Table tbl in tables)
{
TableLogOnInfo objTableLogOnInfo = new TableLogOnInfo();
objTableLogOnInfo.ConnectionInfo = objConnectionInfo;
tbl.ApplyLogOnInfo(objTableLogOnInfo);
}
将报告源绑定到 Crystal Report 查看器
//Reset report source
crystalReportViewer1.ReportSource = objMyReport;
设置 SQL 存储过程参数
ParameterField objParameterField = crystalReportViewer1.ParameterFieldInfo[0];
ParameterDiscreteValue objParameterDiscreteValue;
//Set value for first parameter
objParameterDiscreteValue = new ParameterDiscreteValue();
objParameterDiscreteValue.Description = "First Parameter";
objParameterDiscreteValue.Value = "First Value";
objParameterField.CurrentValues.Add(objParameterDiscreteValue);
//Reset params
crystalReportViewer1.ParameterFieldInfo.Add(objParameterField);
objParameterField = crystalReportViewer1.ParameterFieldInfo[1];
//Set value for second parameter
objParameterDiscreteValue = new ParameterDiscreteValue();
objParameterDiscreteValue.Description = "Second Parameter";
objParameterDiscreteValue.Value = "Second Value";
objParameterField.CurrentValues.Add(objParameterDiscreteValue);
//Reset params
crystalReportViewer1.ParameterFieldInfo.Add(objParameterField);
//So on.....
现在,在刷新报告按钮点击事件中,不要刷新报告,而是手动刷新报告。使用以下代码,可以防止在加载和刷新报告时弹出参数值对话框
private void crystalReportViewer1_ReportRefresh
(object source, CrystalDecisions.Windows.Forms.ViewerEventArgs e)
{
//Don't handle refresh event on refresh button click
e.Handled = true;
//Manually refresh
((ReportClass)crystalReportViewer1.ReportSource).Refresh();
//AReset dynamic database connection information
//...
//Reset report source
//...
//Reset SQL parameters
//...
}
以下是给定的 C# 代码示例:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.CrystalReports;
using CrystalDecisions.Shared;
namespace MyCrystalReport
{
public partial class MyCrystalReport : Form
{
public MyCrystalReport()
{
InitializeComponent();
}
//Crystal report object
private MyReport objMyReport;
//Connection info object
private ConnectionInfo objConnectionInfo;
private void Form1_Load(object sender, EventArgs e)
{
//Initialize report
objMyReport = new MyReport();
//Set database settings for connection
setDatabaseSettings();
//Loads report first time
refreshReport();
}
/// <summary>
/// Sets Database Settings
/// </summary>
private void setDatabaseSettings()
{
objConnectionInfo = new ConnectionInfo();
objConnectionInfo.ServerName = "ServerName";
objConnectionInfo.DatabaseName = "DBName";
objConnectionInfo.UserID = "UserId";
objConnectionInfo.Password = "Password";
}
private void crystalReportViewer1_ReportRefresh
(object source, CrystalDecisions.Windows.Forms.ViewerEventArgs e)
{
//Don't handle refresh event on refresh button click
e.Handled = true;
//Manually refresh
((ReportClass)crystalReportViewer1.ReportSource).Refresh();
}
/// <summary>
/// Refreshes report
/// </summary>
private void refreshReport()
{
//Set dynamic database connection information
Tables tables =
((ReportClass)crystalReportViewer1.ReportSource).Database.Tables;
foreach (Table tbl in tables)
{
TableLogOnInfo objTableLogOnInfo = new TableLogOnInfo();
objTableLogOnInfo.ConnectionInfo = objConnectionInfo;
tbl.ApplyLogOnInfo(objTableLogOnInfo);
}
//Reset report source
crystalReportViewer1.ReportSource = objMyReport;
//Reset SQL parameters
setSQLParams();
}
/// <summary>
/// Sets SQL stored procedure parameters
/// </summary>
private void setSQLParams()
{
ParameterField objParameterField =
crystalReportViewer1.ParameterFieldInfo[0];
ParameterDiscreteValue objParameterDiscreteValue;
//Set value for first parameter
objParameterDiscreteValue = new ParameterDiscreteValue();
objParameterDiscreteValue.Description = "First Parameter";
objParameterDiscreteValue.Value = "First Value";
objParameterField.CurrentValues.Add(objParameterDiscreteValue);
//Reset params
crystalReportViewer1.ParameterFieldInfo.Add(objParameterField);
objParameterField = crystalReportViewer1.ParameterFieldInfo[1];
//Set value for second parameter
objParameterDiscreteValue = new ParameterDiscreteValue();
objParameterDiscreteValue.Description = "Second Parameter";
objParameterDiscreteValue.Value = "Second Value";
objParameterField.CurrentValues.Add(objParameterDiscreteValue);
//Reset params
crystalReportViewer1.ParameterFieldInfo.Add(objParameterField);
//So on.....
}
}
}
祝愿
希望这对于所有需要上述功能的人有所帮助。祝您愉快。干杯!
历史
- 2008 年 9 月 27 日:初始发布