提要 本文試驗將幫助你創建一個使用Crystal Report的Web應用程序— 報告中的數據來源於一個對象集合,你將創建一個專門的類來保存股票市場數據 。
一、開發目標
結束本試驗後,你將能夠更好地:
· 創建一個專門的類來保存股票市場值。
· 實例 化這個類。
· 使用數據填充一個對象集合。
· 通 過一個web表單動態地添加數據。
· 使用Crystal Report Designer熟練地創建一個水晶報表。
二、內容說明
本實驗將引 導你創建一個Crystal Reports web應用程序—報告中的數據來源於一個對 象集合。該應用程序是用Crystal Reports for Visual Studio 2005 Beta 2進 行開發成功。
然後,你將創建一個專門的類來保存股票市場值,實例化 該類並使用數據填充一個對象集合,並且通過一個web表單進一步動態地添加數 據。然後,你將創建一個水晶報表,通過使用Crystal Report Designer控件 —它連接到對象集合並且動態地生成一個圖表和股票摘要信息。
三 、練習一:Web應用程序安裝
說明 在本練習中,你將創建一個新的網站 ,並且應用標准設置來完成此練習。
詳細步驟
1. 在Visual Studio中創建一個新的ASP.NET Web站點。
· 雙擊桌面上的 Visual Studio 2005 Beta 2快捷方式。
· 點擊“文件|新 建|網站”。
· 在“新建網站”對話中,點擊 “ASP.NET 網站”。
· 在“位置”列表中 ,選擇“文件系統”。
· 在“語言”列表 中,選擇“Visual C#”。
· 在“位置” 文本域中,接受默認的路徑和名稱。
· 點擊OK。
2. 添加 Crystal Report Viewer 控件。
· 從Solution Explorer中,雙 擊Default.aspx以打開該web表單。
· 點擊在該表單底部的 “設計”按鈕來把Web表單改變到設計視圖。
· 從工 具欄中,展開Crystal Reports結點並且定位到CrystalReportViewer控件。
· 把CrystalReportViewer控件拖動到該Web表單。
· 如果“Smart Task”面板上的 “CrystalReportViewer Tasks”被打開,則按下Esc鍵關閉它。
· “Smart Task”面板是Visual Studio 2005中的一 個新特征—允許用較少的代碼來創建工程。在這個選項卡中,你將使用一 種編程方式,因此不必使用“Smart Task”面板。
· 點擊Properties選項卡並且選擇CrystalReportViewer。
· 從 Properties窗口中,把ID屬性設置為crystalReportViewer。
· 從文件菜單下,點擊SaveAll。
3. 添加編程環境。
· 點 擊Solution Explorer選項卡。
· 在Solution Explorer中,右擊 Default.aspx並且點擊“View Code”。
· 在類簽名 的上面,使用“using”語句加入對裝配集命名空間的引用聲明。
using CrystalDecisions.CrystalReports.Engine;
using CrystalDecisions.Shared;
· 在這個類中,添加一個新 的private型且無返回值的助理方法ConfigureCrystalReports()。
private void ConfigureCrystalReports()
{}
· ConfigureCrystalReports()是一個助理方法— 它負責在運行時刻與報告交互。它還負責以編程方式與報告進行交互。為了正確 地配置CrystalReportViewer,必須從中Page_Init()調用它。
· 使用顯示的適當語法添加Page_Init事件處理器。
private void Page_Init(object sender, EventArgs e)
{}
· 在Visual Studio 2005的一個C# Web表單中,在code-behind類中的Page_Init事 件處理器是被自動地依附到Init事件的。這個事件處理器簽名必須正確匹配以便 進行調用。
· 最後,在Page_Init事件處理器中,加入對 ConfigureCrystalReports()助理方法的調用。
ConfigureCrystalReports();
· 從文件菜 單下,點擊“Save All”。
· 現在,你已經准備好創 建你的定制股票市場信息類了。
四、練習2:創建一個定制的股票市場信 息
說明 在本練習中,你要創建一個定制的類來保存股票市場信息。這個 類將用於填充一個對象集合。
詳細步驟
· 在Solution Explorer中,右擊粗體的網站名,然後點擊“Add New Item”。
· 然後,出現“Add New Item ”對話框。
· 在Visual Studio“Installed Templates”域中, 選擇“Class”。
· 在Name字段中,輸入Stock,然後 點擊Add。
· 在隨後出現的對話框中點擊Yes。
· 在Visual Studio 2005中,所有的類必須被放置到一個App Code文件夾下,如果 要使用它們的話。當你點擊Add按鈕時,將出現一個警告對話框問你是否想把你 的類放到這個App_Code文件夾下。
· 本文中的Stock類必須被設 置為public類,以便當你創建報告時存取它。請一定要確保你創建的類是public 型。
public class Stock
{
public Stock()
{}
}
· 在這個類中,加入三個private字段。
private string _symbol;
private double _price;
private int _volume;
· 然後,你將把三個public讀/ 寫屬性加入以封裝這三個private字段。
· 創建一個新的屬性, 命名為Symbol。
public string Symbol
{
get
{
return _symbol;
}
set
{
_symbol = value;
}
}
· 創建一個新的屬 性,命名為Price。
public double Price
{
get
{
return _price;
}
set
{
_price = value;
}
}
· 創建一個新的屬性 ,命名為Volume。
public int Volume
{
get
{
return _volume;
}
set
{
_volume = value;
}
}
· 最後,創建一個 新的構造器,它使用三個public屬性作為參數。
public Stock (String symbol, int volume, double price)
{
_symbol = symbol;
_volume = volume;
_price = price;
}
· 從Build菜單下,點擊“Build Website” 。
· 如果你有任何構建錯誤現在就修改它們。
· 現在,你已經准備好從內置的Crystal Report Designer中存取這個對象了。
五、練習3:創建一個水晶報表
說明 在本練習中,你將在內置的 Crystal Report Designer中創建一個新的Crystal report,然後把這個報告綁 定到Stock對象。
詳細步驟
· 右擊網站名並且點擊 “Add New Item”。
· 在“Add New Item” 對話框中,選擇“Crystal Report”。
· 在Name字段中,輸入StockObjects.rpt,然後點擊Add。
· 在“Crystal Reports Gallery”對話框中,點擊 OK。
· 在“Standard Report Creation Wizard”對 話框中,展開“Project Data”及子結點“.NET Objects”。
· 將出現該工程中的一個類列表。
· 展開Stock類來觀察一個可選擇的子結點。
· 點擊向右的箭頭,以便把“Stock”類子結點移動到“Selected Tables”面板上。
· 點擊Next。
· 展開 Stock並且點擊“>>”以便把所有的列移動到“Fields to Display”面板上。
· 點擊Next。
· 選 擇Symbol並且點擊向右的箭頭來把它移動到“Group By”面板上。
· 點擊Finish。
六、練習4:把你的水晶報表綁定到 Crystal Report Viewer
說明 在這個練習中,你將把Stock對象報告綁定 到Crystal Report Viewer,把報告的數據源設置為一個對象集合,並且用編程 方式來填充一個對象集合。
詳細步驟
1. 把報告綁定到Crystal Report Viewer。
· 切換到默認的Code-Behind類, Default.aspx.cs。
· 在類簽名之上,加入對命名空間 System.Collections的引用。
using System.Collections;
· 這個參考使你能夠存取ArrayList類,而 ArrayList實現了ICollection。這使得ArrayList成為用來構建一個為Crystal Reports所識別的對象集合的若干類的類型之一。
· 添加一個新 的類級別的ArrayList,命名為stockValues。
private ArrayList stockValues;
· 為ReportDocument報告包裝類添加一個 新的類級別的聲明,變量名為stockObjectsReport。並把它設置為private型。
private ReportDocument StockObjectsReport;
· 在你在練習1創建的 ConfigureCrystalReports()方法中,聲明一個字符串變量,命名它為 reportPath,並且把一個指向本地報告的運行時刻路徑賦值給它。把本地報告文 件的名字作為一個字符串參考傳遞給Server.MapPath()方法。這樣以來,把本地 報告映射到運行時刻文件路徑。
String reportPath = Server.MapPath("StockObjects.rpt");
· 實 例化ReportDocument類。
StockObjectsReport = new ReportDocument();
· 在下一行中,調用 ReportDocument實例的Load()方法,並且把reportPath字符串變量傳遞給它。
StockObjectsReport.Load (reportPath);
· 這個ReportDocument類是 CrystalDecisions.CrystalReports。Engine命名空間的一個成員。你已經在 “練習1: Web應用程序安裝”中添加了對這個命名空間的聲明(在C# 中是使用“using”)。當你實例化ReportDocument並且加載一個報 告時,你可以通過SDK來存取這個報告。
· 然後,把這個報告的 數據源設置為“stockValues ArrayList”。
StockObjectsReport.SetDataSource (stockValues);
· 最後,把CrystalReportViewer的 ReportSource屬性綁定到ReportDocument實例。
crystalReportViewer.ReportSource = stockObjectsReport;
l. 現在,這個Stock對象報告被綁定到 Crystal Report Viewer並且頁面顯示正確的報告;然而,當前的報告被綁定到 一個空數據源上,因此報告中沒有要顯示的信息。在下一步中,你將用樣本數據 以編程方式填充stockValues ArrayList。
2. 以編程方式填充一個對象 集合。
3. 在這個任務中,你將把Session代碼添加到ASPX code-behind 類。如果在session中沒有值,將會生成默認值。如果session中有值,它們將被 賦值到stockValues ArrayList中。
· 在這個類中,添加一個新 的public范圍的不具有返回值的助理方法,命名為 PopulateStockValuesArrayList()。
public void PopulateStockValuesArrayList()
{}
· 在 PopulateStockValuesArrayList()方法中,在現有代碼前,創建一個if/else條 件塊—它檢查是否存在一個名為stockValues的Session對象。
if(Session["stockValues"] == null)
{}
else
{}
· 在這個If塊中,實例化一個新的 ArrayList()。
stockValues = new ArrayList ();
· 然後,使用Stock類的重載構造器來創建和實例化 Stock的三個實例。
Stock s1 = new Stock("AWRK", 1200,28.47);
Stock s2 = new Stock("CTSO",800, 128.69);
Stock s3 = new Stock("LTWR",1800, 12.95);
· 把這三個實例添加到stockValues。
stockValues.Add(s1); stockValues.Add(s2); stockValues.Add(s3);
· 把更新的stockValues ArrayList添加到session中。
Session ["stockValues"]=stockValues;
· 在Else塊 中,加入一行代碼以便把session中的當前值賦給stockValues ArrayList。
stockValues = (ArrayList)Session ["stockValues"];
· 最後,從 ConfigureCrystalReports()方法中調用PopulateStockValuesArrayList()。
· 這應該是ConfigureCrystalReports()方法中被執行代碼的第 一行。
PopulateStockValuesArrayList ();
· 從Build菜單下,點擊Build Solution。
· 如果你有任何構建錯誤現在就修改它們。
· 從 Debug菜單下,點擊“Start Debugging”。
· 如果這 是你啟動調試器的第一次,那麼將出現一個對話框告訴你必須修改Web.config文 件。點擊OK按鈕以啟動調試功能。
· Default.aspx頁面連同三個 缺省值加載到你的浏覽器中。
· 關閉Internet Explorer窗口。
七、練習5:把數據動態地添加到股票報告上
說明 在上一個練習 中,你用編程方式填充對象集合。在本練習中,你將學習如何動態地從你的網站 把信息添加到你的數據源。該信息能夠在你的報表中得到自動更新。
詳 細步驟
1. 添加控件到Web表單。
· 在Design視圖中打開 Default.aspx文件。
· 為了在Design視圖中打開一個ASPX頁面, 首先打開文件,然後點擊在該表單底部的Design按鈕。
· 點擊 CrystalReportViewer控件來選擇它。
· 按下左箭頭鍵,以便出 現閃爍的光標,並且按回車鍵從視圖中往下移動四次。
· 從工具 箱中,把一個TextBox控件拖動到Web表單。
· 從Property菜單下 ,把ID設置為symbol。
· 把第二個TextBox控件拖動到Web表單。 把這第二個TextBox放到第一個下面。
· 從Property菜單下,把 ID設置為price。
· 把第三個TextBox控件拖動到Web表單。把這 第三個TextBox控件放到第二個下面。
· 從Property菜單下,把 ID設置為volume。
· 現在,你可以發現把文本添加在每一個文本 框旁邊極有助於標識哪個控件相應於哪個參數。
· 然後,從工具 箱中,把一個按鈕控件拖動Web表單上。把該按鈕放到這三個TextBox控件下。
· 從Property菜單下,把該按鈕的ID設置為 addStockInformation。
· 把該按鈕的Text設置為“Add Stock Information”。
· 最後,雙擊“Add Stock Information” 按鈕。
· 雙擊按鈕控件將打開Code-behind 類並且自動生成一個addStockInformation_click()事件處理器。
2. 把 信息添加到集合。
· 在addStockInformation_click()事件處理 器中,創建並且實例化一個新的Stock對象。
Stock temp = new Stock();
· 在addStockInformation_click()方法中,創 建一個try/catch塊。
try
{}
catch
{}
· 輸入到一個Web表單中的信息屬於String類型。因為 Stock類中的兩個字段都是numerical型,所以你需要編寫代碼來把Web表單中的 String值轉換為numerical值。try/catch語句有助於保護你的web應用程序免於 崩潰—在類型轉換出現錯誤匹配期間。
· 在Try塊中,把在 Web表單中的symbol字段的值賦值到Stock對象的Symbol屬性。
temp.Symbol = symbol.Text;
· 在下一行中,把在Web表 單中的price字段的值賦值到Stock對象的Price屬性。注意,在賦值之前,要把 Web表單中的這個值轉化為一個Double。
temp.Price = Convert.ToDouble(price.Text);
· 然後,把在Web表單 中的volume字段的值賦值到Stock對象的Volume屬性。注意,在賦值之前,要把 Web表單中的這個值轉化為一個整數。
temp.Volume = Convert.ToInt32(volume.Text);
· 在try/catch塊的外 面,把“Stock Object”添加到stockValues ArrayList。
stockValues.Add(temp);
· 更新當前存在 於Session中的stockValues的值。
Session ["stockValues"] = stockValues;
· 最後, 調用ConfigureCrystalReports()方法。這將把報告重新綁定到這個更新過的 stockValues—一個對象集合。
ConfigureCrystalReports ();
· 從Build菜單下,點擊“Build Solution”。
· 如果你遇到任何構建錯誤,則現在就修改 。
· 從Debug菜單下,點擊“Start Debugging”。
· 如果沒有出現構建錯誤,Default.aspx頁面將使用三個缺省值 加載到你的浏覽器。為了添加其它值,適當地填充文本框並且點擊“Add Stock Information”按鈕。報告將會被動態地更新。
· 當 你運行你的網站時,報告將裝載到你的浏覽器窗口中—使用三個缺省值( 你是在練習4中以編程方式添加的)。在報告上面共有三個TextBox控件和一個按 鈕控件。使用這些控件,你可以動態地更新你的一個對象集合,並且看到這一更 新的結果會反映到你的報告中。
· 關閉Internet Explorer窗口 。
八、練習6:在報告中添加圖表和摘要信息
說明 至此,你已經 擁有一個全功能的網站,它將顯示一個基於一個對象集合的水晶報表。該站點將 顯示以編程方式輸入到一個對象集合中的信息,以及在運行時刻被動態地添加的 信息。
在這個練習中,你將添加兩個圖表,一個calculated字段和摘要 信息。
詳細步驟
1. 把一個圖表添加到報告中。
· 從solution explorer下,打開StockObjects.rpt。
· 從Crystal Reports菜單下,選擇Insert,並且點擊Chart。
· 在 “Chart Expert”對話框中,選擇一個Pie圖。
· 選 擇Data選項卡。
· 選擇Stock.Symbol並且點擊最右方向箭頭以把 Stock.Symbol字段移動到“On Change Of”字段。
· 選擇Stock.Volume並且點擊最右方向箭頭以把Stock.Volume字段移動到Show Value(s)字段。
· 點擊OK。
· 創建一個新的 “Report Header”節,並且把一個圖表對象添加到這一節中。
· 從Debug菜單下,點擊“Start Debugging”。
· 如果不出現構建錯誤,那麼Default.aspx頁面將加載到你的浏 覽器中。
· 關閉Internet Explorer窗口。
2. 添加一個 基於一個formula字段的圖表。在這一節中,你將創建一個顯示合計信息的圖表 。首先,你將創建一個公式以計算一個特定的持股值,然後創建一個餅圖 —它顯示你的所有持股值的比例值。
· 從Crystal Reports 菜單下,選擇Report,並且點擊“Formula Workshop”。
· 在“Formula Workshop”對話框中,選擇 “Formula Fields”。
· 點擊New按鈕創建一個新公 式。
· 在“Formula Name”對話框中,輸入值。
· 點擊“Use Editor”。
· 添加代碼 以把price字段值與volume字段值相乘。
{Stock.Volume}* {Stock.Price}
· 點擊Save並關閉。
· 從 Crystal Reports菜單下,選擇Insert並且點擊Chart。
· 在 “Chart Expert”對話框下,選擇一個Pie圖。
· 點 擊Data選項卡。
· 選擇Stock.Symbol並且點擊最右方向箭頭把 Stock.Symbol字段移動到“On Change Of”字段。
· 選擇Worth並且點擊最右方向箭頭把Worth公式移動到“Show Value(s) ”字段。
· 點擊Text選項卡。
· 在Title旁 邊,清除“Auto-text”復選框。
· 在Title字段中輸 入Worth/Symbol。
· 點擊OK。
· 一個新的Report Header節被創建,並且有一個Chart對象被添加到這一節上。
· 為了重新放置在一個水晶報表中的對象的位置,你可以用鼠標拖動之並把它們放 在任何你想放置的位置。你可以使用在表單底部的“Main Report Preview“按鈕來顯示你的報告的一個預覽。
3. 把Formula和 Summary字段添加到你的報告中。在這一節中,你添加一個formula字段到你的報 告,還有一個摘要字段—它來計算你的portfolio的總值。
· 展開Field Explorer的“Formula Fields”結點。
· 把worth公式拖動到你的報告。把這個字段放到你的報告的節 中。
· 如果“Field Explorer”不可見,從View菜單 下選擇“Document Outline”。這個字段將顯示每一行的值。使用一 個summary字段顯示你的portfolio的總值。
· 從“Crystal Reports”菜單下,選擇“Insert”,點擊 “Summary”。
· “Insert Summary”對 話框出現。
· 從“Choose the Field to Summarize”字段下選擇Worth公式。
· 從 “Calculate this Summary”字段下選擇“Sum”。
· 從“Summary Location”字段下選擇“Grand Total”。
· 點擊OK。
把一個摘要字段添加到報告 中。
· 從“Debug”菜單下,點擊“Start Debugging”。
· 如果沒有出現構建錯誤,Default.aspx頁 面將加載到你的浏覽器。
· 關閉Internet Explorer窗口。
4. 添加一個前面已經存在的報告。在這一節中,你將讓你的Web應用程 序使用一個位於你的文件系統中的現有報告。
· 右擊Solution Explorer中的StockObjects.rpt。
· 點擊Delete。
· 點擊彈出的對話框中的OK。
· 在Solution Explorer中,右擊加粗的網站名,然後點擊“Add Existing Item” 。
· 在“Add Existing Item”對話框中,導航到 “C:\Microsoft Hands-On-Lab\HOL-ILL05\Source\Excercises”, 並選擇StockObjects.rpt文件。
· 點擊Add。
· 從Debug菜單下,點擊“Start Debugging”。
· 如果 沒有出現構建錯誤,那麼Default.aspx page將加載到你的浏覽器中並且顯示你 的新報告。
· 關閉Internet Explorer窗口。