我目前正在将一个项目从 .NET Framework 迁移到 .NET 7。 在该项目中,我们生成了一些报告。每个报告都有一个模板文件 (
.rfx
),我们根据用户输入填充数据。
在.NET 7版本的FastReport中,没有
MSChartObject
。在 C# 代码中,我将 MSChartObject
替换为 Chart
中的 System.Windows.Forms.DataVisualization.Charting
类。
代码中不再有编译错误,但报告模板文件中仍然存在对
MSChartObject
的引用 (.rfx
)。
我尝试像代码中那样用 Chart 替换它,但这不起作用。
当我使用新的快速报表设计器打开
.rfx
文件时,它说它不知道 MSChartObject
(如预期),但我找不到任何其他图表对象来替换它。
ChartTemplate.rfx
:
<?xml version="1.0" encoding="utf-8"?>
<Report>
<ScriptText>
<!-- bits of code with no reference to the chartObjects -->
<Dictionary>
<!-- a few business objects -->
<MSChartObject Name="MSChart1" Left="727.65" Top="37.8" Width="302.4" Height="368.55">
<MSChartSeries Name="Series1"/>
</MSChartObject>
<MSChartObject Name="MSChart2" Left="9.45" Top="37.8" Width="699.3" Height="189">
<MSChartSeries Name="Series2"/>
</MSChartObject>
<MSChartObject Name="MSChart3" Left="9.45" Top="236.25" Width="699.3" Height="170.1">
<MSChartSeries Name="Series3"/>
</MSChartObject>
</Dictionary>
</Report>
当我尝试使用 FastReport
Report
类在代码中加载模板文件时,会发生错误。
var templateReport = new Report();
templateReport.Load(_TemplatePath);
用什么替换
MSChartObject
文件中的 .rfx
?
或者我必须做什么才能识别 System.Windows.Forms.DataVisualization.Charting
文件中的 Chart
.rfx
对象?
我还尝试将
System.Windows.Forms.DataVisualization.Charting
导入到 <Script>
文件的 .rfx
部分,但这并没有改变任何东西。
经过大量搜索和反复试验,我找到了解决问题的方法。 在 FastReport 的 .Net 7 版本中,不再有 MSChartObject,因此我们必须将其从报告模板(.rfx 文件)中删除。 然后我们必须替换.Net代码中的MSChartObjects。
我的第一个解决方案只对了一半,不要使用
System.Windows.Forms.DataVisualization.Charting
Chart
,使用命名空间FastReport.DataVisualization.Charting
。
用此命名空间中的相同类替换图表所需的所有对象(系列、图例、图表区域等)
FastReport.DataVisualization.Charting
。
我没有找到将图表直接集成到 FastReport ReportPage 中的方法,因此我使用了此解决方法。
图表对象中是我创建的图表,将其转换为图像,然后通过将其父级设置为页面的DataBand来添加到报表页面。 通过设置一个Bounds Rectangle来设置图片的位置。
var stream = new MemoryStream();
chart.SaveImage(stream, FastReport.DataVisualization.Charting.ChartImageFormat.Bmp);
var pictureObject = new PictureObject() { Image = new Bitmap(stream) };
pictureObject.Parent = dataBand1;
pictureObject.Bounds = new RectangleF((int)Math.Ceiling(Units.Centimeters * 17.0f), 0, chart.Width, chart.Height);
我希望这对未来的人有帮助。 我在网上几乎找不到这方面的信息。