2

ネストされたオブジェクトを Microsoft レポートで動作させようとしています。http://www.gotreportviewer.com/objectdatasources/index.htmlからサンプル コードをダウンロードしたところ、正しく実行されました。

Windows フォームとそのコードに基づいて、次の小さなアプリを作成しました。入れ子になったオブジェクトの値を参照すると、データが表示される場所に "#Error" が表示されるだけです。

このレポートでは、Web サイトで推奨されているのと同じネストされたオブジェクト構文を使用しています。

=Fields!Name.Value.FirstName

私のコンピューターのアプリケーションでは機能しますが、私のコンピューターでは機能しません。理解できない!誰かがこれに遭遇したことがありますか、またはなぜこれが起こるのか知っていますか?

さらに、これが関連しているかどうかはわかりませんが、ClientItem のインスタンスを 1 つだけ LocalReport.DataSources オブジェクトに追加することはできません。リストでなければなりません。ただし、レンダリングすると、レポートのテーブルに (#Errored) データが 1 行だけ表示されます。

どんな助けでも大歓迎です!

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 に答える