blackpeony85 发表于 2017-6-20 14:34:36

ActiveReports区域报表中插入chart,并非绑定绘制曲线的问题

本帖最后由 blackpeony85 于 2017-6-20 14:38 编辑

用VS2013做Winforms开发,在工程中添加了一个ActiveReports10 Section Report(code-based)报表


并且在报表页面中插入了一个chart,因为绘制图表的数据是程序中计算出的一组值,所以chart控件中的曲线坐标不是从数据库中读取。
自己写了代码,给chart控件的Series绑定坐标值
srp.chartControl1.Series.Points.AddRange(GetDglCharSeriesPoint(float[] aglData, float flowPos));

void GrapeCity.ActiveReports.Chart.DataPoint GetDglCharSeriesPoint(float[] aglData, float flowPos)
{
   GrapeCity.ActiveReports.Chart.DataPoint[] ps = new GrapeCity.ActiveReports.Chart.DataPoint;
   for(int i = 0; i <samplecount;i++ )
    {
      ps = new GrapeCity.ActiveReports.Chart.DataPoint(((double)i / samplerate * 1000).ToString("0.0"), new                                                GrapeCity.ActiveReports.Chart.DoubleArray((aglData + flowPos).ToString()), false);
    }
return ps;
}
这样的话就可以在chart中绘制出自己想要的曲线。并且这种方法可以成功实现。因为数据量较大,绘制曲线速度特别慢,并且是不是报错一个错误:

为了防止图片不显示,错误明细:
System.OutOfMemoryException: 引发类型为“System.OutOfMemoryException”的异常。
   在 System.Attribute.InternalGetCustomAttributes(PropertyInfo element, Type type, Boolean inherit)
   在 System.Attribute.GetCustomAttributes(MemberInfo element, Type type, Boolean inherit)
   在 System.Attribute.GetCustomAttribute(MemberInfo element, Type attributeType, Boolean inherit)
   在 GrapeCity.ActiveReports.Chart.Item.ToXml(String nodeName, GraphXmlSerializationContext context)
   在 GrapeCity.ActiveReports.Chart.DataPoint.ToXml(String nodeName, GraphXmlSerializationContext context)
   在 GrapeCity.ActiveReports.Chart.Item.#VDC(String nodeName, GraphXmlSerializationContext context)
   在 #CDC.#KU.ToXml(Object obj, String nodeName, GraphXmlSerializationContext context)
   在 #CDC.#KU.ToXml(Object obj, String nodeName, GraphXmlSerializationContext context)
   在 GrapeCity.ActiveReports.Chart.Item.ToXml(String nodeName, GraphXmlSerializationContext context)
   在 GrapeCity.ActiveReports.Chart.Item.#VDC(String nodeName, GraphXmlSerializationContext context)
   在 #CDC.#KU.ToXml(Object obj, String nodeName, GraphXmlSerializationContext context)
   在 #CDC.#KU.ToXml(Object obj, String nodeName, GraphXmlSerializationContext context)
   在 GrapeCity.ActiveReports.Chart.Exchange.Persistence.ToXml(SharpGraph sharpChartControl, XmlElement rootElement, Boolean includeData)
   在 GrapeCity.ActiveReports.Chart.SharpGraph.QuickSave(BinaryWriter binWriter)
   在 GrapeCity.ActiveReports.SectionReportModel.ChartControl.QuickSave(BinaryWriter binWriter)
   在 GrapeCity.ActiveReports.SectionReportModel.ARControl.#MYA(BinaryWriter binWriter)
   在 GrapeCity.ActiveReports.SectionReportModel.Section.#jBb(Stream stream)
   在 GrapeCity.ActiveReports.SectionReportModel.Section.#gBb()
   在 #sxA.#mqb.#LDb()
   在 #sxA.#mqb.#SDb(Section section, Int32 insPos)
   在 #sxA.#vqb.#vEb()
   在 #sxA.#vqb.#bZA(Page newPage, Single left, Single top, Single right, Single bottom, UInt32 flags, UInt32& status)
   在 GrapeCity.ActiveReports.SectionReport.#4yb()
   在 GrapeCity.ActiveReports.SectionReport.Run(Boolean syncDocument)
   在 GrapeCity.ActiveReports.SectionReport.Run()
   在 GrapeCity.ActiveReports.Viewer.Win.Rpx.RpxReport.LoadDocument(SectionDocument document)
   在 GrapeCity.ActiveReports.Viewer.Win.Rdf.RdfDocumentReportBase.<>c__DisplayClass11.#7yz()
   在 GrapeCity.ActiveReports.Viewer.Win.AsyncLoader.<>c__DisplayClass7.#cAz(Object param0, DoWorkEventArgs param1)
   在 System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
   在 System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)


不知道这种非绑定的方式绘制曲线是否正确,速度是否还能提高,异常错误什么原因?


Lenka.Guo 发表于 2017-6-20 18:21:21

内存溢出问题,数据量过大导致耗费内存较多,您如果要计算之后赋值,可以尝试在SQL 语句处理完计算后,为Chart赋值。

blackpeony85 发表于 2017-6-21 08:54:25

Lenka.Guo 发表于 2017-6-20 18:21
内存溢出问题,数据量过大导致耗费内存较多,您如果要计算之后赋值,可以尝试在SQL 语句处理完计算后,为Ch ...

数据量确实很大,大概数组的长度有时大到几十万,没有用SQL语句,这个数据是采集后以文件的形式存储在磁盘上的。数据回放时,直接从文件中读取,并且需要绘制成曲线。那么请问,这个数据量有什么限制?我这种大数据量去chart中绘制曲线的。还有什么更好的方式?

Lenka.Guo 发表于 2017-6-21 15:49:24

本帖最后由 Lenka.Guo 于 2017-6-21 15:59 编辑

您的数据点如果只能通过文件获取,而且再加处理,同时加载十几万条的数据,很容易造成内存溢出,您可以考虑使用catcheTODisk
C# private void viewer1_Load(object sender, System.EventArgs e)
{
    rptDocument rpt = new rptDocument();
    rpt.Document.CacheToDisk = true;
    rpt.Document.CacheToDiskLocation = "C:\\Temp";
    rpt.Run();
    viewer1.Document=rpt.Document;
}

blackpeony85 发表于 2017-6-22 09:27:57

Lenka.Guo 发表于 2017-6-21 15:49
您的数据点如果只能通过文件获取,而且再加处理,同时加载十几万条的数据,很容易造成内存溢出,您可以考虑 ...

你好,用了你的这种方法,试了一组值,数组长度175501(这还不是最大的长度),依旧报内存溢出的错误。而且绘制曲线的速度非常非常的慢。在利用ActiveReports生成报表之前,我在界面上也有绘制曲线的功能,用的时一个叫zedgraph的绘图控件,这个绘图控件就是数组长度好像不限制。请问,在我们报表中利用chart绘制曲线还有什么更好的方法吗?

Lenka.Guo 发表于 2017-6-22 11:28:53

您好,
因为17万条数据确实过量,所以这边没有更好的方法提供给您,只能建议 设置一定的间隔来绘制图表,而不是逐个点来绘制。
如果您需要绘制大量的图表数据,还是建议采用专业的图表控件来完成。



blackpeony85 发表于 2017-6-22 13:38:47

Lenka.Guo 发表于 2017-6-22 11:28
您好,
因为17万条数据确实过量,所以这边没有更好的方法提供给您,只能建议 设置一定的间隔来绘制图表, ...

软件主界面上就用了专业的图表控件zedgraph,绘制点过多的曲线没有问题的,但是现在报表中也想要显示。

Lenka.Guo 发表于 2017-6-22 15:10:13

之前电话沟通的,将数据整合为DataTable ,为图表绑定字段,如果您测试完成后,仍不能解决您的问题,AR可能无法满足您的需求。

blackpeony85 发表于 2017-6-22 15:13:53

Lenka.Guo 发表于 2017-6-22 15:10
之前电话沟通的,将数据整合为DataTable ,为图表绑定字段,如果您测试完成后,仍不能解决您的问题,AR可能 ...

能不能发一个图表绑定DataTable的示例?

Lenka.Guo 发表于 2017-6-22 16:30:41

图表控件使用视频:http://gcdn.gcpowertools.com.cn/forum.php?mod=viewthread&tid=24603&extra=page%3D1

动态绑定上数据源:
http://blog.gcpowertools.com.cn/post/ActiveReports_DataSource_RunTime.aspx
页: [1] 2
查看完整版本: ActiveReports区域报表中插入chart,并非绑定绘制曲线的问题