您的位置:首页 > 编程语言 > C#

CS下在C#里调用显示水晶报表

2012-04-10 16:04 274 查看
/// <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);



}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: