首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> C# >> 關於C#

VS2005 Crystal Reports Web 應用開發全流程:從對象數據源到動態圖表

     編輯:關於C#

專案目標

構建 ASP.NET Web 應用,使用 **Crystal Reports for VS2005**,以 **對象集合 (`List`)** 為數據源,實現:

  • 股票數據建模與集合填充
  • Web 表單動態添加數據並即時刷新報表
  • 報表設計:分組、圖表 (餅圖)、公式字段、彙總字段
  • 報表部署:嵌入 `.rpt` 與外部加載 `.rpt` 兩種模式

數據模型:Stock 類

// 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;
}

練習 1:創建 Web 站點與 CrystalReportViewer

  1. VS2005 → 文件 → 新建網站 → **ASP.NET 網站** (C#,文件系統)。
  2. `Default.aspx` 切換到**設計視圖**。
  3. 工具箱 → **Crystal Reports** → 拖入 `CrystalReportViewer` (ID=`crystalReportViewer`)。
  4. 關閉智能任務面板 (將使用代碼控制)。
  5. 代碼後置 `Default.aspx.cs` 頂部添加引用:
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
using System.Collections; // ArrayList

練習 2:配置報表運行時綁定

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;
    }
}

練習 3:填充對象集合 (Session 持久化)

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"];
    }
}

練習 4:設計報表 (StockObjects.rpt)

  1. 網站右鍵 → 添加新項 → **Crystal Report** → 命名 `StockObjects.rpt`。
  2. 專家向導:
  • 數據源:`Project Data` → `ADO.NET Datasets` → 選擇 `Stock` 類 (編譯後出現)。
  • 字段:全部移至 `Fields to Display`。
  • 分組:按 `Symbol` 分組。

完成後設計器顯示報表結構:`Report Header` / `Group Header (Symbol)` / `Details` / `Group Footer` / `Report Footer`。

練習 5:Web 表單動態添加數據

界面增強

  • 三個 `TextBox`:`txtSymbol`、`txtPrice`、`txtVolume` (ID 對應)。
  • 一個 `Button`:`btnAddStock` (Text="添加股票")。

點擊事件處理

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;
    }
}

練習 6:報表進階 — 圖表、公式、彙總

1. 添加餅圖:按 Symbol 顯示 Volume 分布

  • 菜單 `Insert` → `Chart` → 選 `Pie` 圖。
  • Data 頁:`On change of` 選 `Stock.Symbol`;`Show Values` 選 `Stock.Volume`。
  • 放置於 `Report Header` 區域。

2. 創建公式字段:Worth (持倉價值 = Price * Volume)

  • 菜單 `Report` → `Formula Workshop` → `Formula Fields` 右鍵 New → 名稱 `Worth`。
  • 編輯器輸入:`{Stock.Volume} * {Stock.Price}`。
  • 保存關閉。

3. 添加第二個餅圖:按 Symbol 顯示 Worth 分布

  • 同樣 `Insert` → `Chart` → `Pie`。
  • `Show Values` 選擇公式字段 `Worth`。
  • 標題設置為 "Worth/Symbol"。

4. 將 Worth 公式字段拖入 Details 區顯示每行價值

5. 添加彙總字段:Grand Total (Worth 總和)

  • 菜單 `Insert` → `Summary`。
  • 字段選 `Worth`,運算選 `Sum`,位置選 `Grand Total` (報表尾部)。
  • 彙總字段自動生成於 `Report Footer`,可拖動調整位置。

練習 7:使用外部現有 .rpt 文件

  1. 方案資源管理器刪除專案內 `StockObjects.rpt`。
  2. 右鍵網站 → `Add Existing Item` → 選擇外部路徑 `.rpt` 文件。
  3. 代碼中 `Server.MapPath("StockObjects.rpt")` 自動解析副本路徑。
  4. 運行驗證報表正常顯示。

關鍵技術點總結

技術點關鍵代碼/設置
數據源類型`ArrayList` 實現 `ICollection`,`ReportDocument.SetDataSource()` 接受
運行時綁定時機`Page_Init` (早於 `Page_Load`,確保 Viewer 生命周期正確)
Session 持久化跨回郵保持數據,`ArrayList` 需序列化 (默認支持)
公式字段語法`{Table.Field}` 格式,支持算術/邏輯/字符串函數
圖表數據綁定`On change of` = 分組字段,`Show Values` = 數值字段/公式
彙總字段自動計算 Sum/Count/Avg/Max/Min,支持分組/報表級彙總

避坑指南與現代替代

  • ⚠️ **Crystal Reports for VS 版本綁定嚴重**:VS2005 專用 CR 版本,升級 VS 需重新安裝對應 CR 運行時。
  • ⚠️ **部署需安裝 CR 運行時** (合併模組/安裝包),增加伺服器維護成本。
  • ⚠️ **`ArrayList` 非強類型**,建議改用 `List` (需 .NET 2.0+),`SetDataSource` 同樣支持 `IEnumerable`。
  • 🔧 **現代替代方案**:
    • RDLC (ReportViewer):VS 內建、無額外運行時、支援對象數據源。
    • FastReport / Stimulsoft:輕量、跨平台、.NET Core 原生支持。
    • Excel/PDF 庫 (EPPlus, NPOI, QuestPDF, PdfSharp) 直接導出,靈活度最高。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved