構建 ASP.NET Web 應用,使用 **Crystal Reports for VS2005**,以 **對象集合 (`List
// App_Code/Stock.cs (必須放在 App_Code 目錄下供設計器識別)
public class Stock {
public Stock() { }
public Stock(string symbol, int volume, double price) {
Symbol = symbol; Volume = volume; Price = price;
}
public string Symbol { get; set; }
public double Price { get; set; }
public int Volume { get; set; }
// 派生屬性:持倉價值
public double Worth => Price * Volume;
}
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Collections; // ArrayList
public partial class _Default : System.Web.UI.Page {
private ArrayList stockValues; // 數據源
private ReportDocument stockReport; // 報表文檔
protected void Page_Init(object sender, EventArgs e) {
ConfigureCrystalReports(); // 必須在 Page_Init 執行
}
private void ConfigureCrystalReports() {
PopulateStockValues(); // 1. 填充數據
// 2. 加載 .rpt 文件
string reportPath = Server.MapPath("StockObjects.rpt");
stockReport = new ReportDocument();
stockReport.Load(reportPath);
// 3. 綁定數據源
stockReport.SetDataSource(stockValues);
// 4. 關聯 Viewer
crystalReportViewer.ReportSource = stockReport;
}
}
private void PopulateStockValues() {
if (Session["stockValues"] == null) {
// 首次加載:默認數據
stockValues = new ArrayList();
stockValues.Add(new Stock("AWRK", 1200, 28.47));
stockValues.Add(new Stock("CTSO", 800, 128.69));
stockValues.Add(new Stock("LTWR", 1800, 12.95));
Session["stockValues"] = stockValues;
} else {
// 回郵:從 Session 恢復
stockValues = (ArrayList)Session["stockValues"];
}
}
完成後設計器顯示報表結構:`Report Header` / `Group Header (Symbol)` / `Details` / `Group Footer` / `Report Footer`。
protected void btnAddStock_Click(object sender, EventArgs e) {
try {
var stock = new Stock {
Symbol = txtSymbol.Text.Trim(),
Price = Convert.ToDouble(txtPrice.Text),
Volume = Convert.ToInt32(txtVolume.Text)
};
stockValues.Add(stock); // 更新集合
Session["stockValues"] = stockValues; // 同步 Session
ConfigureCrystalReports(); // 重新綁定刷新報表
} catch (Exception ex) {
// 處理轉換錯誤等
lblError.Text = "輸入格式錯誤: " + ex.Message;
}
}
| 技術點 | 關鍵代碼/設置 |
|---|---|
| 數據源類型 | `ArrayList` 實現 `ICollection`,`ReportDocument.SetDataSource()` 接受 |
| 運行時綁定時機 | `Page_Init` (早於 `Page_Load`,確保 Viewer 生命周期正確) |
| Session 持久化 | 跨回郵保持數據,`ArrayList` 需序列化 (默認支持) |
| 公式字段語法 | `{Table.Field}` 格式,支持算術/邏輯/字符串函數 |
| 圖表數據綁定 | `On change of` = 分組字段,`Show Values` = 數值字段/公式 |
| 彙總字段 | 自動計算 Sum/Count/Avg/Max/Min,支持分組/報表級彙總 |