提要 本文試驗將幫助你創建一個使用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窗口。