WebサイトでReportViewerコントロールを使用していますが、レポートに3つ以上のサブレポートが含まれています。多くの場合、サブレポートのデータはオプションのデータであるために存在しません。読者に知らせるために、適切にフォーマットされ、整列されたメッセージを出力する必要があります。私は次のコードを持っています:
protected void ReportViewer1_SubreportProcessing(object sender, SubreportProcessingEventArgs e)
{
DataTable dtReport = GetReportSub(reportId);
foreach (DataRow drRow in dtReport.Rows)
{
if (Replace(drRow["subName"].ToString(), " ", "") == e.ReportPath)
{
string sSQLMain = SQLReplacer(drRow["subSQL"].ToString());
DataTable dtData = BuildCollectionArray(sSQLMain, new OdbcParameter());
if (dtData.Rows.Count == 0)
{
//TODO: Hide the report and show a friendly message
}
else
{
ReportDataSource dataSource = new ReportDataSource("DS" + Replace(drRow["subName"].ToString(), " ", ""), dtData);
e.DataSources.Add(dataSource);
}
break;
}
}
}
これにより、データがフェッチされ、それを必要とするレポートに追加されます。ただし、データがない場合の唯一のオプションはNoRowsMessageプロパティです。ただし、各サブレポートのメインレポートのNoRowsMessageプロパティは制限が多すぎます。
理想的には、エクスプレッションまたはコードを使用して、各サブレポートに行なしメッセージ自体を処理させたいと思います。ただし、Microsoftの作業方法の欠陥は、レポートが表示するデータがあることを条件としていることであるように思われます。