如何在C#中打开telerik报告文件并访问报告的数据源?

如何在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

我试图打开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 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项) { //递归地将连接字符串设置为项目中的项目