找回密码
 立即注册

QQ登录

只需一步,快速开始

blackpeony85

注册会员

2

主题

9

帖子

98

积分

注册会员

积分
98
最新发帖
blackpeony85
注册会员   /  发表于:2017-6-20 14:34  /   查看:7539  /  回复:15
本帖最后由 blackpeony85 于 2017-6-20 14:38 编辑

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


并且在报表页面中插入了一个chart,因为绘制图表的数据是程序中计算出的一组值,所以chart控件中的曲线坐标不是从数据库中读取。
自己写了代码,给chart控件的Series绑定坐标值
srp.chartControl1.Series[0].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[samplecount];
     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)


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


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x

15 个回复

倒序浏览
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
  1. C# private void viewer1_Load(object sender, System.EventArgs e)
  2. {
  3.     rptDocument rpt = new rptDocument();
  4.     rpt.Document.CacheToDisk = true;
  5.     rpt.Document.CacheToDiskLocation = "C:\\Temp";
  6.     rpt.Run();
  7.     viewer1.Document=rpt.Document;
  8. }
复制代码


回复 使用道具 举报
blackpeony85
注册会员   /  发表于:2017-6-22 09:27:57
5#
Lenka.Guo 发表于 2017-6-21 15:49
您的数据点如果只能通过文件获取,而且再加处理,同时加载十几万条的数据,很容易造成内存溢出,您可以考虑 ...

你好,用了你的这种方法,试了一组值,数组长度175501(这还不是最大的长度),依旧报内存溢出的错误。而且绘制曲线的速度非常非常的慢。在利用ActiveReports生成报表之前,我在界面上也有绘制曲线的功能,用的时一个叫zedgraph的绘图控件,这个绘图控件就是数组长度好像不限制。请问,在我们报表中利用chart绘制曲线还有什么更好的方法吗?
回复 使用道具 举报
Lenka.Guo讲师达人认证 悬赏达人认证
超级版主   /  发表于:2017-6-22 11:28:53
6#
您好,
因为17万条数据确实过量,所以这边没有更好的方法提供给您,只能建议 设置一定的间隔来绘制图表,而不是逐个点来绘制。
如果您需要绘制大量的图表数据,还是建议采用专业的图表控件来完成。



回复 使用道具 举报
blackpeony85
注册会员   /  发表于:2017-6-22 13:38:47
7#
Lenka.Guo 发表于 2017-6-22 11:28
您好,
因为17万条数据确实过量,所以这边没有更好的方法提供给您,只能建议 设置一定的间隔来绘制图表, ...

软件主界面上就用了专业的图表控件zedgraph,绘制点过多的曲线没有问题的,但是现在报表中也想要显示。
回复 使用道具 举报
Lenka.Guo讲师达人认证 悬赏达人认证
超级版主   /  发表于:2017-6-22 15:10:13
8#
之前电话沟通的,将数据整合为DataTable ,为图表绑定字段,如果您测试完成后,仍不能解决您的问题,AR可能无法满足您的需求。
回复 使用道具 举报
blackpeony85
注册会员   /  发表于:2017-6-22 15:13:53
9#
Lenka.Guo 发表于 2017-6-22 15:10
之前电话沟通的,将数据整合为DataTable ,为图表绑定字段,如果您测试完成后,仍不能解决您的问题,AR可能 ...

能不能发一个图表绑定DataTable的示例?
回复 使用道具 举报
Lenka.Guo讲师达人认证 悬赏达人认证
超级版主   /  发表于:2017-6-22 16:30:41
10#
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 立即注册
返回顶部