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

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

starIconstarIconstarIcon
emptyStarIcon
starIcon
emptyStarIcon

3.42/5 (7投票s)

2008年9月27日

CPOL

1分钟阅读

viewsIcon

50995

downloadIcon

2

本文包含代码,用于防止为每个 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 日:初始发布
© . All rights reserved.