使用者需在報表中動態切換圖表類型 (如柱狀圖 ↔ 圓餅圖)。Reporting Services API 無直接支援,解決方案:執行期修改 RDLC XML。
SaleReportByCountry (依國家統計銷售額).rdlc 本質是 XML 檔案。圖表類型儲存在:
/Report/Body/ReportItems/Chart[@Name='chart1']/Type
SalesReport.rdlc 為 DynamicSalesReport.rdlc
private void ChangeChartType(string type) // "Column" 或 "Pie"
{
XmlDocument doc = new XmlDocument();
doc.Load("DynamicSalesReport.rdlc");
XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("x", "https://schemas.microsoft.com/sqlserver/reporting/2005/01/reportdefinition");
nsmgr.AddNamespace("rd", "https://schemas.microsoft.com/SQLServer/reporting/reportdesigner");
// 修改圖表類型節點
XmlNode chartTypeNode = doc.SelectSingleNode(
"/x:Report/x:Body/x:ReportItems/x:Chart[@Name='chart1']/x:Type", nsmgr);
chartTypeNode.InnerText = type;
// 存入記憶體流
MemoryStream ms = new MemoryStream();
doc.Save(ms);
ms.Position = 0;
// 重新載入報表定義
reportViewer1.Reset(); // 必須 Reset 才生效
reportViewer1.LocalReport.LoadReportDefinition(ms);
// 重新繫結資料 (LoadReportDefinition 會清除資料來源)
saleReportByCountryTableAdapter1.Fill(
northwindDataSet1.SaleReportByCountry,
new DateTime(1996, 1, 1), new DateTime(1998, 1, 1));
ReportDataSource ds = new ReportDataSource(
"NorthwindDataSet_SaleReportByCountry",
northwindDataSet1.SaleReportByCountry);
reportViewer1.LocalReport.DataSources.Clear();
reportViewer1.LocalReport.DataSources.Add(ds);
reportViewer1.RefreshReport();
ms.Close();
}
private void btnColumnChart_Click(object sender, EventArgs e)
=> ChangeChartType("Column");
private void btnPieChart_Click(object sender, EventArgs e)
=> ChangeChartType("Pie");
| 關鍵步驟 | 說明 |
|---|---|
| 命名空間管理 | RDLC 有預設命名空間,XPath 必須註冊前綴 |
| XPath 定位 | 精確定位 Chart[@Name='chart1']/Type 節點 |
| MemoryStream | 避免檔案鎖定,記憶體中修改後直接載入 |
| Reset() | ReportViewer.Reset() 清除舊定義,LoadReportDefinition 才生效 |
| 重新繫結資料 | LoadReportDefinition 會清除 DataSources,必須重新加入 |
常用類型字串:Column、Bar、Pie、Line、Area、Doughnut、Point 等 (需符合 RS 圖表類型常數)。
透過「RDLC 即 XML」特性,配合 XmlDocument、MemoryStream、ReportViewer.Reset/LoadReportDefinition,輕鬆實現圖表類型動態切換。此技巧同樣適用於動態修改報表標題、欄位可見性、樣式等屬性。