博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
CS下在C#里调用显示水晶报表
阅读量:2125 次
发布时间:2019-04-30

本文共 3359 字,大约阅读时间需要 11 分钟。

/// <summary>

  /// CS下在C#里调用显示水晶报表
  /// 水晶报表在CrystalReport9中定义,数据源可以是表、视图、存储过程(最后一句必须是select语句),可以包含子报表
  /// 调用实例:LoadReport(this.crystalReportViewer1,"D:\\66.rpt","kys","hrdb","sa","kys");
  /// 2004-10-29 writed by 华阳
  /// </summary>
  /// <param name="ReportViewer">报表浏览器CrystalDecisions.Windows.Forms.CrystalReportViewer</param>
  /// <param name="StrRptPaht">报表文件的路径</param>
  /// <param name="StrServer">服务器</param>
  /// <param name="StrDatabase">数据库</param>
  /// <param name="StrUser">登陆名称</param>
  /// <param name="StrPassword">密码</param>
  public void LoadReport(CrystalDecisions.Windows.Forms.CrystalReportViewer ReportViewer,string StrRptPaht,
   string StrServer, string StrDatabase, string StrUser, string StrPassword)
  {
  
   string StrParaName="";
   string StrRptTableName="";
   string StrLocation="";
   ReportDocument Rpt =new ReportDocument();//表示一个报表,并且包含定义、格式化、加载、导出和打印该报表的属性和方法
   SubreportObject SubRptObj;//表示放在报表中的子报表。子报表是主报表内的独立或链接的报表。
   ReportDocument SubRpt;

   ParameterFields ParamFields=new ParameterFields();

   ParameterField ParamField ;
   ParameterDiscreteValue ParamDiscreteValue;

   TableLogOnInfo LogOnInfo;

   try

   {
    //加载报表
    Rpt.Load(StrRptPaht);
    //报表参数的赋值****************************************************

    foreach(CrystalDecisions.CrystalReports.Engine.ParameterFieldDefinition ParaFieldDef in  Rpt.DataDefinition.ParameterFields )

    {
     //只为主报表的参数进行赋值
     if(ParaFieldDef.ReportName=="")
     {
      StrParaName=ParaFieldDef.Name;

      ParamField=new ParameterField();

      ParamDiscreteValue=new ParameterDiscreteValue();
      ParamField.ParameterFieldName = StrParaName;
      //注:用户自定义为参数赋值!!!!!!!!!!!!!!!!!!!!!!!!!
      if(StrParaName.ToLower()=="depid")
       ParamDiscreteValue.Value = "dg00";
      else
       ParamDiscreteValue.Value = "ky0001";
      //!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
      ParamField.CurrentValues.Add (ParamDiscreteValue);
      ParamFields.Add (ParamField);
     }
    }
    //******************************************************************
    // 将参数字段集合放入查看器控件。
    if(ParamFields.Count>0)
     ReportViewer.ParameterFieldInfo = ParamFields;

    //设置数据库连接参数

    ConnectionInfo CnInfo = new ConnectionInfo();
    CnInfo.ServerName = StrServer;
    CnInfo.DatabaseName = StrDatabase;
    CnInfo.UserID = StrUser;
    CnInfo.Password = StrPassword;
    foreach( CrystalDecisions.CrystalReports.Engine.Table DTable in Rpt.Database.Tables)
    {
     LogOnInfo=DTable.LogOnInfo;
     LogOnInfo.ConnectionInfo=CnInfo;
     DTable.ApplyLogOnInfo(LogOnInfo);
     //更换服务器数据库验证
     StrRptTableName=DTable.Location.Substring(DTable.Location.LastIndexOf(".") + 1);
     StrLocation=StrDatabase+".dbo."+StrRptTableName;
     DTable.Location=StrLocation;
    }
    
    #region 对所有子报表更换服务器数据库验证
    //获取主报表的所有子报表
    foreach (ReportObject obj in Rpt.ReportDefinition.ReportObjects)
    {
     //判断是否为子报表对象
     if (obj.Kind == ReportObjectKind.SubreportObject)  
     {
      SubRptObj = (SubreportObject) obj;
      SubRpt = Rpt.OpenSubreport(SubRptObj.SubreportName);

      //读取子报表的所有数据库表

      foreach (CrystalDecisions.CrystalReports.Engine.Table DTable in SubRpt.Database.Tables)
      {  
       LogOnInfo = DTable.LogOnInfo;
       LogOnInfo.ConnectionInfo = CnInfo;
  
       //加载数据库连接信息
       DTable.ApplyLogOnInfo(LogOnInfo);
       //更换服务器和数据库
       StrRptTableName=DTable.Location.Substring(DTable.Location.LastIndexOf(".") + 1);
       StrLocation=StrDatabase+".dbo."+StrRptTableName;
       DTable.Location=StrLocation;
      }    
     }
    }
    #endregion

    //将报表赋给报表浏览器

    ReportViewer.ReportSource=Rpt;
    //ReportViewer.RefreshReport();
     
   }
   catch(Exception ee)
   {
    string StrMsg=ee.Source+ee.Message;
    System.Windows.Forms.MessageBox.Show(StrMsg);
    
   }
  }

转载地址:http://iairf.baihongyu.com/

你可能感兴趣的文章
Leetcode C++《热题 Hot 100-48》406.根据身高重建队列
查看>>
《kubernetes权威指南·第四版》第二章:kubernetes安装配置指南
查看>>
Leetcode C++《热题 Hot 100-49》399.除法求值
查看>>
Leetcode C++《热题 Hot 100-51》152. 乘积最大子序列
查看>>
[Kick Start 2020] Round A 1.Allocation
查看>>
Leetcode C++ 《第181场周赛-1》 5364. 按既定顺序创建目标数组
查看>>
Leetcode C++ 《第181场周赛-2》 1390. 四因数
查看>>
阿里云《云原生》公开课笔记 第一章 云原生启蒙
查看>>
阿里云《云原生》公开课笔记 第二章 容器基本概念
查看>>
阿里云《云原生》公开课笔记 第三章 kubernetes核心概念
查看>>
阿里云《云原生》公开课笔记 第四章 理解Pod和容器设计模式
查看>>
阿里云《云原生》公开课笔记 第五章 应用编排与管理
查看>>
阿里云《云原生》公开课笔记 第六章 应用编排与管理:Deployment
查看>>
阿里云《云原生》公开课笔记 第七章 应用编排与管理:Job和DaemonSet
查看>>
阿里云《云原生》公开课笔记 第八章 应用配置管理
查看>>
阿里云《云原生》公开课笔记 第九章 应用存储和持久化数据卷:核心知识
查看>>
linux系统 阿里云源
查看>>
国内外helm源记录
查看>>
牛客网题目1:最大数
查看>>
散落人间知识点记录one
查看>>