#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);
}
}
}
Я надеюсь, что это поможет вам….