我试图让嵌套对象在Microsoft报告中工作。我从http://www.gotreportviewer.com/objectdatasources/index.html下载了示例代码,它运行正常。
我根据Windows窗体及其代码构建了以下小应用程序,当我引用嵌套对象值时,我得到的所有内容都是数据出现位置的“#Error”。
在报告中,我使用了网站上推荐的相同嵌套对象语法:
=Fields!Name.Value.FirstName
它适用于我的计算机上的应用程序,但不适用于我的计算机。我无法理解!有没有人遇到这个,或者知道为什么会这样?
此外 - 我不知道这是否相关 - 我无法将一个ClientItem实例添加到LocalReport.DataSources对象。它必须是一个列表。但是,当它呈现时,它只在报告的表格中显示一行(#Errored)数据。
任何帮助将不胜感激!
namespace ReportTest
{
public class ClientItem
{
public int Id { get; set; }
public ClientName Name { get; set; }
}
public class ClientName
{
public ClientName(string first, string last)
{
FirstName = first;
LastName = last;
}
string FirstName { get; set; }
string LastName { get; set; }
}
public partial class Form1 : Form
{
private List<ClientItem> clients = new List<ClientItem>();
public Form1()
{
InitializeComponent();
PopulateLists();
GenerateReport();
}
private void PopulateLists()
{
clients.Add(new ClientItem { Id = 1, Name = new ClientName("Adrian", "Adesco") } );
clients.Add(new ClientItem { Id = 2, Name = new ClientName("Brian", "Briar") } );
clients.Add(new ClientItem { Id = 3, Name = new ClientName("Clive", "Cussler") } );
}
private void GenerateReport()
{
this.Text = "Report Control Demo";
this.ClientSize = new System.Drawing.Size(950, 600);
ReportViewer reportViewer = new ReportViewer();
reportViewer.ProcessingMode = ProcessingMode.Local;
reportViewer.LocalReport.ReportPath = "TestReport.rdlc";
reportViewer.LocalReport.DataSources.Add(new ReportDataSource("ReportTest_ClientItem", clients));
reportViewer.Dock = DockStyle.Fill;
this.Controls.Add(reportViewer);
reportViewer.RefreshReport();
}
}
}
答案 0 :(得分:1)
好的,测试用例(上面)问题的解决方案是使ClientName中的属性公开:
public class ClientName
{
public ClientName(string first, string last)
{
FirstName = first;
LastName = last;
}
public string FirstName { get; set; }
public string LastName { get; set; }
}
这解决了我的测试用例问题。
但是,我的实际报告仍然存在问题。它仍然是一个错误。事实证明,这是因为子对象实际上是在不同的程序集中定义的。
为了使它能够工作,必须将以下行添加到包含子对象的项目的AssemblyInfo.cs文件中:
[assembly: AllowPartiallyTrustedCallers]
现在它有效!花了很长时间才发现 - 希望这有助于某人......