我正在尝试使用 Microsoft RDLC 报表设计器和 ReportViewerCore.WinForms nuget 包将一些基本报告添加到 .Net 8.0 C# WinForms 应用程序中,但发现自己遇到了许多问题。
有人有让这个工作并克服这些问题的经验吗?
到目前为止我采取的步骤是:
public class Class1 : IClass1
{
public int MyProperty { get; set; }
}
public interface IClass1
{
int MyProperty { get; set; }
}
Class1
类,向其中添加一个字符串属性,重新编译,并尝试将其删除并重新添加为数据源,但在这里得到了相同的错误。我的结论是,报表设计者能够确定类中的 CLR 类型似乎存在某种问题,提取接口可以在某种程度上缓解这种情况,但根本问题可能是设计者,特别是设计者“数据源配置向导”似乎试图使用错误版本的 System.Runtime 程序集。
我试图弄清楚将正确的系统运行时 DLL 放入扩展的安装文件夹中是否可以解决此问题,但由于无法确定扩展的实际安装位置以及哪个 DLL 而受到阻碍如果我能找到把它放在哪里的话,我应该复制到这个位置。
在这里搜索这个问题表明其他人过去也遇到过类似的问题,但我找不到任何解决方案来解决我的具体问题。我还尝试使用旧版本的 ReportViewer nuget 包,针对 .Net Framework,这些给了我完全相同的结果。
如果我必须为我想要用于报告的任何 POCO 提取接口,我可以接受。但是,如果我无法使用任何复杂类型(例如包含其他对象列表的对象)进行报告,这将是一个阻碍。
如 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”文件一切都应该工作。
您拥有存储库的设计新报告部分中的所有信息。