C# 如何直接在ActiveReports子报表上绘制?

C# 如何直接在ActiveReports子报表上绘制?,c#,drawing,activereports,C#,Drawing,Activereports,我想根据一些参数化数据创建自己的自定义图形,并在子报表中生成它。我在报告上放置了ActiveReports.Picture元素。然后,我使用System.Drawing.Graphics对象在内存中绘制图像,然后将其设置为Picture控件的image属性。这工作正常,但生成的PDF上的图像模糊,即使将pdfExport1.ImageQuality设置为最高 我认为直接在ActiveReports文档画布上绘制会更好,但我不知道如何使其工作。所有的例子都指向同一个基本例子: 问题是这个例子是断

我想根据一些参数化数据创建自己的自定义图形,并在子报表中生成它。我在报告上放置了ActiveReports.Picture元素。然后,我使用System.Drawing.Graphics对象在内存中绘制图像,然后将其设置为Picture控件的image属性。这工作正常,但生成的PDF上的图像模糊,即使将pdfExport1.ImageQuality设置为最高

我认为直接在ActiveReports文档画布上绘制会更好,但我不知道如何使其工作。所有的例子都指向同一个基本例子:

问题是这个例子是断章取义的。我看不出这段代码应该在哪里运行?在子报告中?在通话报告中?完全夸大报告?当我在报告中尝试它时,Pages属性没有页面(得到一个索引越界错误),因此我可能在错误的事件中进行了尝试

明确地说,这不是一个数据驱动的报告。我通过参数获取所需的所有数据。不需要数据库访问


谢谢

在您引用的文档中的示例中,绘制线是在父文档/报表(而不是子报表)上绘制的。但是,您可以在处理节时在页面上绘制。要做到这一点,您可以将渲染代码放在部分的处理事件中,例如或(我将避免使用该格式,因为在使用该格式时有许多注意事项)

要从节的事件中在页面上绘制,可以从中找到节的位置。例如,要在BeforePrint事件的整个部分绘制对角线,可以使用以下代码:

public void Detail_BeforePrint(object sender, System.EventArgs eArgs)
{
    this.CurrentPage.BackColor = System.Drawing.Color.Purple;
    this.CurrentPage.ForeColor = System.Drawing.Color.YellowGreen;
    this.CurrentPage.PenStyle = DataDynamics.ActiveReports.Document.PenStyles.Dot;
    this.CurrentPage.PenWidth = 4;
    this.CurrentPage.DrawLine(Detail.CurrentLocation.X, Detail.CurrentLocation.Y, this.PrintWidth, Detail.Height);
}

此代码在子报表或父报表中应该可以正常工作。显然,如果要从子报表中在页面上绘制,则需要将
this.CurrentPage
更改为
ParentReport.CurrentPage
。如果要相对于页面绘制,可以使用类似的代码,但使用PageEnd事件。这方面有一个很好的例子。但是,PageEvents仅适用于父报表,相对于子报表的位置定位绘图坐标可能比较困难。

在您引用的文档中的示例中,绘图线是在父文档/报表(而不是子报表)上绘制的。但是,您可以在处理节时在页面上绘制。要做到这一点,您可以将渲染代码放在部分的处理事件中,例如或(我将避免使用该格式,因为在使用该格式时有许多注意事项)

要从节的事件中在页面上绘制,可以从中找到节的位置。例如,要在BeforePrint事件的整个部分绘制对角线,可以使用以下代码:

public void Detail_BeforePrint(object sender, System.EventArgs eArgs)
{
    this.CurrentPage.BackColor = System.Drawing.Color.Purple;
    this.CurrentPage.ForeColor = System.Drawing.Color.YellowGreen;
    this.CurrentPage.PenStyle = DataDynamics.ActiveReports.Document.PenStyles.Dot;
    this.CurrentPage.PenWidth = 4;
    this.CurrentPage.DrawLine(Detail.CurrentLocation.X, Detail.CurrentLocation.Y, this.PrintWidth, Detail.Height);
}

此代码在子报表或父报表中应该可以正常工作。显然,如果要从子报表中在页面上绘制,则需要将
this.CurrentPage
更改为
ParentReport.CurrentPage
。如果要相对于页面绘制,可以使用类似的代码,但使用PageEnd事件。这方面有一个很好的例子。但是,PageEvents仅适用于父报表,相对于子报表的位置可能很难确定绘图坐标的方向。

您似乎必须在主页面上绘图,即使是从子报表,这就是为什么CurrentPage为空。因此,子报告的工作如下:

此文件为.ParentReport.CurrentPage


似乎您必须在主页面上绘制,甚至是从子报表中绘制,这就是为什么CurrentPage为空。因此,子报告的工作如下:

此文件为.ParentReport.CurrentPage


谢谢,距离越来越近了,但还是卡住了。在预览模式下,我似乎工作得很好,但在生成报告的第一个this.current页面上,我得到了一个“未设置为对象实例的对象引用”。我正在主报表的detail_格式处理程序中创建子报表,如下所示:this.subGraph.report=new MyGraph();您在哪个事件中访问此.CurrentPage(其中为空)?还将
this.subGraph.Report=new MyGraph()放入。如果需要,您仍然可以从包含子报表的部分的Format事件中访问
this.subGraph.Report
,但是如果您只在ReportStart中执行
new
一次,而不是每个
detail\u Format
事件,这将提供更好的性能。谢谢,这已经越来越近了,但仍然卡住了。在预览模式下,我似乎工作得很好,但在生成报告的第一个this.current页面上,我得到了一个“未设置为对象实例的对象引用”。我正在主报表的detail_格式处理程序中创建子报表,如下所示:this.subGraph.report=new MyGraph();您在哪个事件中访问此.CurrentPage(其中为空)?还将
this.subGraph.Report=new MyGraph()放入。如果需要,您仍然可以从包含子报表的部分的Format事件访问
this.subGraph.Report
,但是如果您只在ReportStart中执行
new
-一次,而不是每个
detail\u格式的事件,这将提供更好的性能。