在 .Net 8.0 下的 C# WinForms 应用程序中使用 Microsoft RDLC 报表设计器添加数据源时出现问题

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

我正在尝试使用 Microsoft RDLC 报表设计器和 ReportViewerCore.WinForms nuget 包将一些基本报告添加到 .Net 8.0 C# WinForms 应用程序中,但发现自己遇到了许多问题。

有人有让这个工作并克服这些问题的经验吗?

到目前为止我采取的步骤是:

  • 将 Microsoft RDLC 报表设计器扩展 (17.0.0) 安装到 Visual Studio Enterprise 2022 (17.10.0) 中
  • 将 ReportViewerCore.WinForms nuget 包 (15.1.19) 安装到我的 WinForms 项目中(这要求我首先安装 Microsoft.CodeAnalysis.Common v4.8.0,这不是当前版本)
  • 将新报表添加到 WinForms 项目中
  • 在“报告数据”窗口中,选择“新建”下拉菜单,然后选择“数据集...”
  • 在“选择数据源类型”对话框中选择“对象”
  • 从我的商业模型项目中选择一个模型类。请注意,此时,没有列出来自同一程序集(我的 WinForms 程序集)的类,但是,这对我来说不是问题。
  • 当选择任何类作为对象数据源时,我会看到以下无用的错误消息:

enter image description here

  • 为了尝试确定是否是我专门对模型类执行的操作导致了问题,然后我创建了一个新的解决方案,除了 WinForms 项目和类库项目之外什么都没有,并重复此过程,使用一个 int 属性创建一个绝对基本的 POCO 类。这有同样的问题。但是,我发现如果我提取该类的接口,并选择该接口作为数据源,那么这将起作用。然后我在原来的解决方案中尝试了这个,再次,这有效:
 public class Class1 : IClass1
 {
     public int MyProperty { get; set; }
 }
 public interface IClass1
 {
     int MyProperty { get; set; }
 }
  • 发现提取类的接口似乎可行,然后我对一个更复杂的模型类做了同样的事情,并尝试将其添加为数据源。然后我收到以下错误(类名已编辑):

enter image description here

  • 然后我回到简单的
    Class1
    类,向其中添加一个字符串属性,重新编译,并尝试将其删除并重新添加为数据源,但在这里得到了相同的错误。

我的结论是,报表设计者能够确定类中的 CLR 类型似乎存在某种问题,提取接口可以在某种程度上缓解这种情况,但根本问题可能是设计者,特别是设计者“数据源配置向导”似乎试图使用错误版本的 System.Runtime 程序集。

我试图弄清楚将正确的系统运行时 DLL 放入扩展的安装文件夹中是否可以解决此问题,但由于无法确定扩展的实际安装位置以及哪个 DLL 而受到阻碍如果我能找到把它放在哪里的话,我应该复制到这个位置。

在这里搜索这个问题表明其他人过去也遇到过类似的问题,但我找不到任何解决方案来解决我的具体问题。我还尝试使用旧版本的 ReportViewer nuget 包,针对 .Net Framework,这些给了我完全相同的结果。

如果我必须为我想要用于报告的任何 POCO 提取接口,我可以接受。但是,如果我无法使用任何复杂类型(例如包含其他对象列表的对象)进行报告,这将是一个阻碍。

c# winforms rdlc reportviewer .net-8.0
1个回答
0
投票

ReportViewerCore.WinForms 存储库的自述文件中所述,新数据集向导在尝试从项目中发现类时失败。 官方的解决方法是将包含类架构的“.xsd”文件添加到您的项目中。

存储库中提供了自动生成“.xsd”所需文件的代码sinppet。您必须更改“types”数组以包含您要使用的类:

var types = new[] { typeof(ReportItemClass1), typeof(ReportItemClass2), typeof(ReportItemClass3) };
var xri = new System.Xml.Serialization.XmlReflectionImporter();
var xss = new System.Xml.Serialization.XmlSchemas();
var xse = new System.Xml.Serialization.XmlSchemaExporter(xss);
foreach (var type in types)
{
    var xtm = xri.ImportTypeMapping(type);
    xse.ExportTypeMapping(xtm);
}
using var sw = new System.IO.StreamWriter("ReportItemSchemas.xsd", false, Encoding.UTF8);
for (int i = 0; i < xss.Count; i++)
{
    var xs = xss[i];
    xs.Id = "ReportItemSchemas";
    xs.Write(sw);
}

我使用“.xsd”文件一切都应该工作。

您拥有存储库的设计新报告部分中的所有信息。

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