Печать диаграммы MS в ASP.net Приложение

#asp.net #mschart

#asp.net #mschart

Вопрос:

Как распечатать диаграмму MSChart в ASP.Net . Кто-нибудь может дать мне какую-нибудь идею, я много искал, но все доступные решения предназначены для приложения Windows, а не для Интернета.

В поисках ваших ценных решений,

Заранее спасибо, Суприя

Ответ №1:

вы можете сделать вот так…..

Примечание: Это примерный пример того, как распечатать диаграмму mschart в asp.net веб-приложение, вы можете изменить это в зависимости от ваших требований…….

 using System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.ComponentModel;
using System.Web.UI.DataVisualization.Charting;
using System.IO;
using System.Web.UI.WebControls;

namespace Avatar_Reports
{
    public class ExtendedChart : Chart
    {
        /// <summary>
        /// This property was added to keep a serialized version of the Chart at a given fixed time.
        /// </summary>
        public string SerializedString { get; set; }

        /// <summary>
        /// Updates the SerializedString property with current state of the object.
        /// </summary>
        public void UpdateSerializedString()
        {
            // Serialize the Chart into serialized Chart variable.
            using (MemoryStream writer = new MemoryStream())
            {
                this.Serializer.Content = SerializationContents.All;
                this.Serializer.Save(writer);
                this.SerializedString = GetStringFromStream(writer);
            }
        }

        /// <summary>
        /// Obtain an ExtendedChart with state and data as saved in the SerializedString property.
        /// </summary>
        /// <returns></returns>
        public ExtendedChart GetChartFromSerialized()
        {
            // Deserialize the Chart into a Chart variable.
            ExtendedChart clonedChart = new ExtendedChart();
            byte[] chartAsArray = System.Text.Encoding.Default.GetBytes(this.SerializedString);
            using (MemoryStream reader = new MemoryStream(chartAsArray))
            {
                clonedChart.Serializer.Content = SerializationContents.All;
                clonedChart.Serializer.Load(reader);
            }

            return clonedChart;
        }

        private string GetStringFromStream(Stream stream)
        {
            using (StreamReader reader = new StreamReader(stream))
            {
                return reader.ReadToEnd();
            }
        }
    }
}
  

затем вы создаете свою страницу с таким объектом, как этот:

…..

 ExtendedChart ReportChart = new ExtendedChart();
Series Series1 = new Series("Series1");
ChartArea ChartArea1 = new ChartArea("ChartArea1");
  

…….
и затем вы можете использовать в своем меню вызов метода, подобного этому

 SerializeChartControls(outputTable);

Session["CtrlToPrint"] = outputTable;
                    Page.ClientScript.RegisterStartupScript(this.GetType(),
                        "Print", "<script language='javascript'>window.open('Print.aspx','PrintMe','height=1000px,width=900px,scrollbars=1');</script>");
  

……

 private void SerializeChartControls(Control root)
{
    foreach (Control c in root.Controls)
    {
        if (c is Chart)
        {
            ExtendedChart theChart = c as ExtendedChart;
            theChart.UpdateSerializedString();
        }
        else if ((c != null) amp;amp; (c.HasControls() == true))
        {
            SerializeChartControls(c);
        }
    }
}      
  

И вы ПЕЧАТАЕТЕ.ASPX может быть таким :

…..

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
using System.Web.UI.DataVisualization.Charting;

namespace Avatar_Reports
{
    public partial class Print : System.Web.UI.Page
    {
        private WebControl ctrlToPrint;
        private string footerText = String.Empty;

        protected void Page_PreInit(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ctrlToPrint = (WebControl)Session["CtrlToPrint"];
                DeserializeChartControls(ctrlToPrint);
                ExpandAllGridViews(ctrlToPrint);
            }
        }

        protected void Page_Init(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                Panel titlePanel = new Panel();
                Label reportTitle = new Label();

                // reportTitle.Text = Session["ReportTitle"].ToString();
                titlePanel.CssClass = "ReportTitlePrinted";

                // titlePanel.Controls.Add(reportTitle);
                // Page.Form.Controls.Add(titlePanel);

                ctrlToPrint.Style.Add("text-align", "center");
                Page.Form.Controls.Add(ctrlToPrint);
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            this.RegisterStartupScript("printPopup", "<script>window.print();</script>");
        }


        private void DeserializeChartControls(Control root)
        {
            foreach (Control c in root.Controls)
            {
                if (c is ExtendedChart)
                {
                    ExtendedChart theChart = c as ExtendedChart;
                    ExtendedChart newChart = theChart.GetChartFromSerialized();

                    // Replace the serialized version by the actual Chart.
                    WebControl chartParent = theChart.Parent as WebControl;
                    int chartIndex = chartParent.Controls.IndexOf(theChart);
                    chartParent.Controls.AddAt(chartIndex, newChart);
                    chartParent.Controls.Remove(theChart);
                }
                else if ((c != null) amp;amp; (c.HasControls() == true))
                {
                    DeserializeChartControls(c);
                }
            }
        }
  

Я надеюсь, что это поможет вам….