如何在C#中打开telerik报告文件并访问报告的数据源?
我试图打开C#中的trdx文件,然后我想访问它的数据源或数据表如何在C#中打开telerik报告文件并访问报告的数据源?,c#,telerik-reporting,telerik-open-access,C#,Telerik Reporting,Telerik Open Access,我试图打开C#中的trdx文件,然后我想访问它的数据源或数据表 使用系统; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms
使用系统;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Telerik.ReportViewer.Common;
using Telerik.Reporting.Data;
using System.Data.SqlClient;
using Telerik.Reporting;
namespace WindowsFormsApplication14
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
string pad = @"Report.trdx";
var connectionString = @"Conection";
var connectionStringHandler = new ReportConnectionStringManager(connectionString);
var sourceReportSource = new UriReportSource { Uri = pad };
//var sourceReportSource = new InstanceReportSource { ReportDocument = new EmployeeSalesSummary() };
var reportSource = connectionStringHandler.UpdateReportSource(sourceReportSource);
this.ReportViewer.ReportSource = reportSource;
this.ReportViewer.RefreshReport();
}
}
class ReportConnectionStringManager
{
readonly string connectionString;
public ReportConnectionStringManager(string connectionString)
{
this.connectionString = connectionString;
}
public Telerik.Reporting.ReportSource UpdateReportSource(Telerik.Reporting.ReportSource sourceReportSource)
{
if (sourceReportSource is Telerik.Reporting.UriReportSource)
{
var uriReportSource = (Telerik.Reporting.UriReportSource)sourceReportSource;
var reportInstance = DeserializeReport(uriReportSource);
ValidateReportSource(uriReportSource.Uri);
this.SetConnectionString(reportInstance);
return CreateInstanceReportSource(reportInstance, uriReportSource);
}
if (sourceReportSource is XmlReportSource)
{
var xml = (XmlReportSource)sourceReportSource;
ValidateReportSource(xml.Xml);
var reportInstance = this.DeserializeReport(xml);
this.SetConnectionString(reportInstance);
return CreateInstanceReportSource(reportInstance, xml);
}
if (sourceReportSource is InstanceReportSource)
{
var instanceReportSource = (InstanceReportSource)sourceReportSource;
this.SetConnectionString((ReportItemBase)instanceReportSource.ReportDocument);
return instanceReportSource;
}
if (sourceReportSource is TypeReportSource)
{
var typeReportSource = (TypeReportSource)sourceReportSource;
var typeName = typeReportSource.TypeName;
ValidateReportSource(typeName);
var reportType = Type.GetType(typeName);
var reportInstance = (Report)Activator.CreateInstance(reportType);
this.SetConnectionString((ReportItemBase)reportInstance);
return CreateInstanceReportSource(reportInstance, typeReportSource);
}
throw new NotImplementedException("Handler for the used ReportSource type is not implemented.");
}
ReportSource CreateInstanceReportSource(IReportDocument report, ReportSource originalReportSource)
{
var instanceReportSource = new InstanceReportSource { ReportDocument = report };
instanceReportSource.Parameters.AddRange(originalReportSource.Parameters);
return instanceReportSource;
}
void ValidateReportSource(string value)
{
if (value.Trim().StartsWith("="))
{
throw new InvalidOperationException("Expressions for ReportSource are not supported when changing the connection string dynamically");
}
}
Report DeserializeReport(UriReportSource uriReportSource)
{
var settings = new System.Xml.XmlReaderSettings();
settings.IgnoreWhitespace = true;
using (var xmlReader = System.Xml.XmlReader.Create(uriReportSource.Uri, settings))
{
var xmlSerializer = new Telerik.Reporting.XmlSerialization.ReportXmlSerializer();
var report = (Telerik.Reporting.Report)xmlSerializer.Deserialize(xmlReader);
return report;
}
}
Report DeserializeReport(XmlReportSource xmlReportSource)
{
var settings = new System.Xml.XmlReaderSettings();
settings.IgnoreWhitespace = true;
var textReader = new System.IO.StringReader(xmlReportSource.Xml);
using (var xmlReader = System.Xml.XmlReader.Create(textReader, settings))
{
var xmlSerializer = new Telerik.Reporting.XmlSerialization.ReportXmlSerializer();
var report = (Telerik.Reporting.Report)xmlSerializer.Deserialize(xmlReader);
return report;
}
}
void SetConnectionString(ReportItemBase reportItemBase)
{
if (reportItemBase.Items.Count < 1)
return;
if (reportItemBase is Report)
{
var report = (Report)reportItemBase;
if (report.DataSource is SqlDataSource)
{
var sqlDataSource = (SqlDataSource)report.DataSource;
sqlDataSource.ConnectionString = connectionString;
}
foreach (var parameter in report.ReportParameters)
{
if (parameter.AvailableValues.DataSource is SqlDataSource)
{
var sqlDataSource = (SqlDataSource)parameter.AvailableValues.DataSource;
sqlDataSource.ConnectionString = connectionString;
}
}
}
foreach (var item in reportItemBase.Items)
{
//recursively set the connection string to the items from the Items collection
SetConnectionString(item);
//set the drillthrough report connection strings
var drillThroughAction = item.Action as NavigateToReportAction;
if (null != drillThroughAction)
{
var updatedReportInstance = this.UpdateReportSource(drillThroughAction.ReportSource);
drillThroughAction.ReportSource = updatedReportInstance;
}
if (item is SubReport)
{
var subReport = (SubReport)item;
subReport.ReportSource = this.UpdateReportSource(subReport.ReportSource);
continue;
}
//Covers all data items(Crosstab, Table, List, Graph, Map and Chart)
if (item is DataItem)
{
var dataItem = (DataItem)item;
if (dataItem.DataSource is SqlDataSource)
{
var sqlDataSource = (SqlDataSource)dataItem.DataSource;
sqlDataSource.ConnectionString = connectionString;
continue;
}
}
}
}
}
}
使用System.Collections.Generic;
使用系统组件模型;
使用系统数据;
使用系统图;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
使用System.Windows.Forms;
使用Telerik.ReportViewer.Common;
使用Telerik.Reporting.Data;
使用System.Data.SqlClient;
使用Telerik.报告;
命名空间Windows窗体应用程序14
{
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
字符串pad=@“Report.trdx”;
变量connectionString=@“连接”;
var connectionstringandler=新报告connectionstringmanager(connectionString);
var sourceReportSource=new UriReportSource{Uri=pad};
//var sourceReportSource=new InstanceReportSource{ReportDocument=new EmployeeSalesSummary()};
var reportSource=connectionString.UpdateReportSource(sourceReportSource);
this.ReportViewer.ReportSource=ReportSource;
这个.ReportViewer.RefreshReport();
}
}
类ReportConnectionStringManager
{
只读字符串连接字符串;
公共报表连接字符串管理器(字符串连接字符串)
{
this.connectionString=connectionString;
}
公共Telerik.Reporting.ReportSource更新报告源(Telerik.Reporting.ReportSource)
{
if(sourceReportSource是Telerik.Reporting.UriReportSource)
{
var uriReportSource=(Telerik.Reporting.uriReportSource)sourceReportSource;
var reportInstance=DeserializeReport(uriReportSource);
ValidateReportSource(uriReportSource.Uri);
this.SetConnectionString(reportInstance);
返回CreateInstanceReportSource(reportInstance,uriReportSource);
}
if(sourceReportSource是XmlReportSource)
{
var xml=(XmlReportSource)sourceReportSource;
ValidateReportSource(xml.xml);
var reportInstance=this.DeserializeReport(xml);
this.SetConnectionString(reportInstance);
返回CreateInstanceReportSource(reportInstance,xml);
}
如果(sourceReportSource是InstanceReportSource)
{
var instanceReportSource=(instanceReportSource)sourceReportSource;
此.SetConnectionString((ReportItemBase)instanceReportSource.ReportDocument);
返回instanceReportSource;
}
if(sourceReportSource为TypeReportSource)
{
var typeReportSource=(typeReportSource)sourceReportSource;
var typeName=typeReportSource.typeName;
ValidateReportSource(类型名称);
var reportType=Type.GetType(typeName);
var reportInstance=(报表)Activator.CreateInstance(报表类型);
this.SetConnectionString((ReportItemBase)reportInstance);
返回CreateInstanceReportSource(reportInstance,typeReportSource);
}
抛出新的NotImplementedException(“未实现所用ReportSource类型的处理程序”);
}
ReportSource CreateInstanceReportSource(IReportDocument报告,ReportSource originalReportSource)
{
var instanceReportSource=newinstancereportsource{ReportDocument=report};
instanceReportSource.Parameters.AddRange(originalReportSource.Parameters);
返回instanceReportSource;
}
void ValidateReportSource(字符串值)
{
if(value.Trim().StartsWith(“=”)
{
抛出新的InvalidOperationException(“动态更改连接字符串时不支持ReportSource的表达式”);
}
}
报表反序列化报表(UriReportSource UriReportSource)
{
var settings=new System.Xml.XmlReaderSettings();
settings.IgnoreWhitespace=true;
使用(var xmlReader=System.Xml.xmlReader.Create(uriReportSource.Uri,设置))
{
var xmlSerializer=new Telerik.Reporting.XmlSerialization.ReportXmlSerializer();
var report=(Telerik.Reporting.report)xmlSerializer.Deserialize(xmlReader);
返回报告;
}
}
报表反序列化报表(XmlReportSource XmlReportSource)
{
var settings=new System.Xml.XmlReaderSettings();
settings.IgnoreWhitespace=true;
var textReader=new System.IO.StringReader(xmlReportSource.Xml);
使用(var xmlReader=System.Xml.xmlReader.Create(textReader,设置))
{
var xmlSerializer=new Telerik.Reporting.XmlSerialization.ReportXmlSerializer();
var report=(Telerik.Reporting.report)xmlSerializer.Deserialize(xmlReader);
返回报告;
}
}
void SetConnectionString(ReportItemBase ReportItemBase)
{
如果(reportItemBase.Items.Count<1)
返回;
如果(reportItemBase是报告)
{
var报告=(报告)reportItemBase;
if(report.DataSource是SqlDataSource)
{
var sqlDataSource=(sqlDataSource)report.DataSource;
sqlDataSource.ConnectionString=ConnectionString;
}
foreach(report.ReportParameters中的var参数)
{
if(parameter.AvailableValues.DataSource为SqlDataSource)
{
var sqlDataSource=(sqlDataSource)parameter.AvailableValues.DataSource;
sqlDataSource.ConnectionString=ConnectionString;
}
}
}
foreach(reportItemBase.Items中的var项)
{
//递归地将连接字符串设置为项目中的项目