2

我正在尝试让嵌套对象在 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();
        }
    }
}
4

1 回答 1

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]

现在它起作用了!花了很长时间才发现-希望这对某人有所帮助...

于 2009-01-23T13:41:23.547 回答