简体   繁体   English

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

[英]How to open the telerik report file in C# and access the DataSource of Report?

我想在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;

                }

            }



        }

    }

}
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM