FastReport MSChartObject 从 .NET Framework 迁移到 .NET 7

问题描述 投票:0回答:1

我目前正在将一个项目从 .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
部分,但这并没有改变任何东西。

c# .net-7.0 mschart fastreport
1个回答
0
投票

经过大量搜索和反复试验,我找到了解决问题的方法。 在 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);

我希望这对未来的人有帮助。 我在网上几乎找不到这方面的信息。

© www.soinside.com 2019 - 2024. All rights reserved.