最近、Visual Studio 2010 を使用して MVC アプリケーションに初めての RDLC レポートを作成しました。
Report Wizard を使用して Report1.rdlc を作成し、次のコントローラー コードを実行して出力を PDF にレンダリングしました。
レポート実行時のデータ ソースは、モデル内のサイト オブジェクトを参照します。すべて正常に実行されますが、出力の 4 列のうち 2 列が #Error としてレンダリングされます
両方の列にすべてのレコードのデータがあり、null はありません
2 つの #Error 列がレンダリングされる列と異なる唯一の点は、それらがモデルの 1 レベル下にあることです。つまり、4つの列のうち:
1 番目のフィールド SiteDescription は OK をレンダリングします 2 番目のフィールド SiteOperator は各行の値を #Error としてレンダリングします 3 番目のフィールド SiteStatus は各行の値を #Error としてレンダリングします 4 番目のフィールド CapacityMW は OK をレンダリングします
注意: SiteOperator は Site.SiteOperator.Operator です。3 番目のフィールドについても同様です。1 番目と 4 番目は、Site テーブルのフィールドです (つまり、この場合はモデルのトップ レベル)。
質問: RDLC がモデルの既存のオブジェクトを操作できるようにするために開発者がしなければならないことは他にありますか? つまり、レポート ウィザードが Report1.rdlc.xml ファイルを作成することに気付きました。おそらくこれを変更する必要があります。これに関するアイデアが尽きてしまいました。どんなコメントでも大歓迎です
これが私のコントローラーコードです:
private void RenderReport(string ReportPath, object Model)
{
var localReport = new LocalReport { ReportPath = ReportPath };
var reportDataSource = new ReportDataSource("DataSet1", Model);
localReport.DataSources.Add(reportDataSource);
var reportType = "PDF";
string mimeType;
string encoding;
string fileNameExtension;
//The DeviceInfo settings should be changed based on the reportType
//http://msdn2.microsoft.com/en-us/library/ms155397.aspx
string deviceInfo =
"<DeviceInfo>" +
" <OutputFormat>PDF</OutputFormat>" +
" <PageWidth>8.5in</PageWidth>" +
" <PageHeight>11in</PageHeight>" +
" <MarginTop>0.5in</MarginTop>" +
" <MarginLeft>1in</MarginLeft>" +
" <MarginRight>1in</MarginRight>" +
" <MarginBottom>0.5in</MarginBottom>" +
"</DeviceInfo>";
Warning[] warnings;
string[] streams;
byte[] renderedBytes;
//Render the report
renderedBytes = localReport.Render(
reportType,
deviceInfo,
out mimeType,
out encoding,
out fileNameExtension,
out streams,
out warnings);
//Clear the response stream and write the bytes to the outputstream
//Set content-disposition to "attachment" so that user is prompted to take an action
//on the file (open or save)
Response.Clear();
Response.ContentType = mimeType;
Response.AddHeader("content-disposition", "attachment; filename=foo." + fileNameExtension);
Response.BinaryWrite(renderedBytes);
Response.End();
}