在ASP.NET页面中实现数据柱状图
生活随笔
收集整理的這篇文章主要介紹了
在ASP.NET页面中实现数据柱状图
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
棒圖有時又稱為"Bar"圖,在ASP.NET中擁有了一個新功能--繪圖功能,通過此功能就能夠按照要實(shí)現(xiàn)的圖表的模樣來繪制,最后在客戶端的瀏覽器中形成一個圖片,從而顯示出圖表來。
本文就是介紹在ASP.NET頁面中實(shí)現(xiàn)Bar圖的具體方法。希望本篇文章能夠讓您領(lǐng)會到ASP.NET中強(qiáng)大的繪圖功能,而我們知道圖表只有在和數(shù)據(jù)庫關(guān)聯(lián)以后,才能夠顯示出更強(qiáng)大的優(yōu)勢。下面就來介紹在ASP.NET頁面中從數(shù)據(jù)庫中提起數(shù)據(jù),并以此數(shù)據(jù)形成Bar圖的具體實(shí)現(xiàn)方法。
一.本文程序設(shè)計(jì)和運(yùn)行的軟件環(huán)境:
(1).微軟公司視窗2000服務(wù)器版。
(2).Visual Studio .Net正式版,.Net FrameWork SDK版本號3705。
(3).MDAC 2.6(Microsoft Data Acess Component)以上版本。
二.建立數(shù)據(jù)源
為了方便起見,本文選擇的數(shù)據(jù)庫類型為本地?cái)?shù)據(jù)庫--Access 2000,如果你使用的是其他數(shù)據(jù)庫類型,只需對下面介紹的程序中的關(guān)于數(shù)據(jù)庫連接的代碼進(jìn)行相應(yīng)的修改就可以了。Access數(shù)據(jù)庫名稱為"db2.mdb",在此數(shù)據(jù)庫中只定義了一張數(shù)據(jù)表"MonthSale",此表的結(jié)構(gòu)如表01所示:
表01:MonthSale數(shù)據(jù)表的結(jié)構(gòu)
在定義完"db2.mdb"數(shù)據(jù)庫中的"MonthSale"數(shù)據(jù)表后,在MonthSale數(shù)據(jù)表中按照表02所示添加記錄:
表02:Table01數(shù)據(jù)表中的記錄情況
在MonthSale數(shù)據(jù)表中添加完這12條記錄后,保存"db2.mdb"數(shù)據(jù)庫到C盤的根目錄中。
三.ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖的關(guān)鍵步驟及其實(shí)現(xiàn)方法:
在ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖首先必須解決二大問題:
(1).首先要解決在ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)庫連接和從數(shù)據(jù)庫中讀取數(shù)據(jù)的方法。
程序要實(shí)現(xiàn)從數(shù)據(jù)庫中一條條的讀取數(shù)據(jù),則要使用OleDbDataReader類,OleDbDataReader類提供了從數(shù)據(jù)庫中逐條讀取數(shù)據(jù)的方法。下面代碼是連接C盤根目錄下的"db2.mdb"數(shù)據(jù)庫,逐條讀取MonthSale數(shù)據(jù)表中的記錄,并把數(shù)據(jù)存放到定義的二個數(shù)組中:
?1string?sRouter?=?"c:\\db2.mdb"?;
?2????????????//獲得當(dāng)前Access數(shù)據(jù)庫在服務(wù)器端的絕對路徑
?3
?4????????????string?strCon?=?"?Provider?=?Microsoft.Jet.OLEDB.4.0;?Data?Source?=?"?+?sRouter?;
?5????????????//創(chuàng)建一個數(shù)據(jù)庫連接
?6
?7????????????OleDbConnection?myConn?=?new?OleDbConnection?(?strCon?)?;
?8????????????string?strCom?=?"?SELECT?YF?,SL?FROM?MonthSale?ORDER?BY?YF"?;
?9????????????myConn.Open?(?)?;
10????????????OleDbCommand?myCommand?=?new?OleDbCommand?(?strCom?,?myConn?)?;
11????????????OleDbDataReader?myOleDbDataReader?=?myCommand.ExecuteReader?(?)?;
12????????????//創(chuàng)建OleDbDataReader實(shí)例,并以此實(shí)例來獲取數(shù)據(jù)庫中各條記錄數(shù)據(jù)
13
14????????????int?[?]?iXiaoSH?=?new?int?[?12?]?;
15????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售數(shù)據(jù)
16
17????????????string?[?]?sMoth?=?new?string?[?12?]?;
18????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售月份
19
20????????????int?iIndex?=?0?;
21????????????while?(?myOleDbDataReader.Read?(?)?)?
22????????????{
23????????????????iXiaoSH?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?1?)?;
24????????????????sMoth?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?0?)?.?ToString?(?)?+?"月"?;
25????????????????iIndex++?;
26????????????}
27????????????//讀取Table01數(shù)據(jù)表中的各條數(shù)據(jù),并存放在先前定義的二個數(shù)組中
28
29????????????myConn?.?Close?(?)?;
30????????????myOleDbDataReader?.?Close?(?)?;
31????????????//關(guān)閉各種資源
(2).根據(jù)得到數(shù)據(jù),繪制圖片,并顯示出來:
通過第一步,已經(jīng)把從數(shù)據(jù)庫中的讀取的數(shù)據(jù)存放到"iXiaoSH"和"sMoth"數(shù)組中。下面就要解決依據(jù)這些數(shù)據(jù)繪制出Bar圖?首先先了解一下在ASP.NET頁面中將要實(shí)現(xiàn)的數(shù)據(jù)Bar圖的模樣。具體可如圖01所示:
圖01:在ASP.NET中實(shí)現(xiàn)的數(shù)據(jù)Bar圖
程序中把圖01所示各個元素,按照區(qū)域分成了五個部分,這五個部分將在后面介紹的程序中分別實(shí)現(xiàn):
1. 構(gòu)建整個圖片
首先要創(chuàng)建一Bitmap實(shí)例,并以此來構(gòu)建一個Graphics實(shí)例,Graphics實(shí)例提供了各種繪制方法,這樣才能按照數(shù)據(jù)的要求在Bitmap實(shí)例上繪制各種圖形。下面代碼是在ASP.NET中創(chuàng)建Bitmap實(shí)例,并以此實(shí)例來構(gòu)建 Graphics實(shí)例的具體方法:
1Bitmap?bm?=?new?Bitmap?(?600?,?250?)?;
2????????????//創(chuàng)建一個長度為600,寬帶為250的Bitmap實(shí)例
3
4????????????Graphics?g?;
5????????????g?=?Graphics.FromImage?(?bm?)?;
6????????????//由此Bitmap實(shí)例創(chuàng)建Graphic實(shí)例
7
8????????????g?.?Clear?(?Color.Snow)?;
9????????????//用Snow色彩為背景色填充此繪畫圖面2. 圖01中的標(biāo)題部分文字:
這是通過Graphics實(shí)例中提供的DrawString方法以指定的字體、顏色、在指定的位置繪制指定的字符串。下面代碼的作用是繪制圖01中標(biāo)題:
1g?.?DrawString?(?"?××公司××××年度銷售情況統(tǒng)計(jì)表"?,?new?Font?(?"黑體"?,?16?)?,?Brushes?.?Black?,?new?Point?(?5?,?5?)?)?;
2????????????//在繪畫圖面的指定位置,以指定的字體、指定的顏色繪制指定的字符串。即為圖表標(biāo)題
33. 圖01中的提示區(qū)域,即圖01中的右上角顯示的內(nèi)容:
要繪制這部分內(nèi)容首先要定位,可以把這部分要繪制的內(nèi)容分成三個小部分:
其一,是圖01中的"單位:萬套"文字,這部分處理起來比較簡單,當(dāng)選定要在圖片中輸出的文字坐標(biāo)后,調(diào)用Graphics實(shí)例中提供的DrawString方法就可以了;
其二,是繪制圖01中的小方塊,首先要調(diào)用Graphics實(shí)例中的DrawRectangle方法在指定位置,以指定的顏色,繪制指定大小的方塊,然后再條約Graphics實(shí)例中的FillRectangle填充這個小方塊就完成了;
其三,是繪制小方塊右邊的文字。同樣要使用Graphics實(shí)例中提供的DrawString方法,只不過位置坐標(biāo)和字體要進(jìn)行相應(yīng)改變罷了。下面代碼功能是繪制圖01右上角顯示的內(nèi)容:
?1//以下代碼是是實(shí)現(xiàn)圖右上部
?2????????????Point?myRec?=?new?Point?(?535?,?30?)?;
?3????????????Point?myDec?=?new?Point?(?560?,?26?)?;
?4
?5????????????//以上是在圖01中為下面繪制定位
?6????????????g?.?DrawString?(?"單位:萬套"?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?new?Point?(?525?,?12?)?)?;
?7???
?8???
?9????????????for?(?int?i?=?0?;?i?<?sMoth.Length?;?i++?)?
10????????????{
11????????????????g?.?DrawRectangle?(?Pens.Black?,?myRec?.?X?,?myRec?.?Y?,?20?,?10?)?;
12????????????????//繪制小方塊
13
14????????????????g?.?FillRectangle?(?new?SolidBrush?(?GetColor?(?i?)?)?,?myRec.X?,?myRec.Y?,?20?,?10?)?;
15????????????????//填充小方塊
16
17????????????????g?.?DrawString?(?sMoth?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?myDec?)?;
18????????????????//繪制小方塊右邊的文字
19
20????????????????myRec?.?Y?+=?15?;
21????????????????myDec?.?Y?+=?15?;
22????????????}
?2????????????int?iBarWidth?=?40?;
?3????????????int?scale?=?10?;
?4????????????for?(?int?i?=?0?;?i?<?iXiaoSH?.?Length?;?i++?)?
?5????????????{
?6????????????????g?.?DrawRectangle?(?Pens.Black,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
?7????????????????//繪制Bar圖
?8
?9????????????????g?.?FillRectangle?(?new?SolidBrush?(GetColor?(?i?))?,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
10????????????????//以指定的色彩填充Bar圖
11
12????????????????g?.?DrawString?(?iXiaoSH?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?(?i?*?iBarWidth?)?+?20?,?235?-?(?iXiaoSH?[?i?]?*?scale?)?)?;
13????????????????//顯示Bar圖代表的數(shù)據(jù)
14????????????}5. 繪制圖片邊框,并形成Jpeg文件格式在客戶端顯示:
繪制圖片邊框,使用的Graphics實(shí)例中的DrawRectangle方法。至于采用Jpeg格式文件在客戶端顯示,是因?yàn)镴peg文件占用的空間較小,利于網(wǎng)絡(luò)傳送。下面代碼是繪制圖01中的邊框,并形成Jpeg文件:
1//以下代碼是繪制邊框,并形成Jpeg文件,供瀏覽器顯示出來
2????????????Pen?p?=?new?Pen?(?Color.Black?,?2?)?;
3????????????g?.?DrawRectangle?(?p?,?1?,?1?,?598?,?248?)?;
4????????????bm.Save?(?Response?.?OutputStream?,?ImageFormat.Gif)?;
四.ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖實(shí)現(xiàn)步驟:
掌握了上面的關(guān)鍵步驟及其解決方法后,在ASP.NET實(shí)現(xiàn)數(shù)據(jù)Bar相對就容易許多了,下面是ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖的具體實(shí)現(xiàn)步驟,在開發(fā)工具上選用的是Visual Stuido .Net企業(yè)構(gòu)建版,采用的開發(fā)語言是C#。
1. 啟動Visual Studio .Net
2. 選擇菜單【文件】|【新建】|【項(xiàng)目】后,彈出【新建項(xiàng)目】對話框
3. 將【項(xiàng)目類型】設(shè)置為【Visual C#項(xiàng)目】
4. 將【模板】設(shè)置為【ASP.NET Web 應(yīng)用程序】
5. 在【位置】的文本框中輸入"http://localhost/Bar"。然后單擊【確定】按鈕,這樣在Visual Studio .Net就會在當(dāng)前項(xiàng)目文件所在目錄中建立一個名稱為"WebBarDemo"文件夾,里面存放是此項(xiàng)目的項(xiàng)目文件,項(xiàng)目中的其他文件存放的位置是計(jì)算機(jī)Internet信息服務(wù)的默認(rèn)的Web站點(diǎn)所在的目錄中新建的一個名稱為"WebBarDemo"的文件夾中。具體如圖02所示:
圖02:新建一個ASP.NET項(xiàng)目對話框
6. 把Visual Studio .Net的當(dāng)前窗口切換到WebForm的代碼編輯窗口,即:WebForm1.aspx.cs文件的編輯窗口。
7. 在WebForm1.aspx.cs文件首部,用下列代碼替換WebForm1.aspx.cs中導(dǎo)入命名空間的代碼
1//下面程序中使用的ImageFormat類所在的命名空間
2using?System.Drawing.Imaging;
3//下面程序中使用到關(guān)于數(shù)據(jù)庫方面的類所在的命名空間
4using?System.Data.OleDb; 8. WebForm1.aspx.cs文件中的Page_Load事件處理代碼中添加下列代碼,下列代碼的作用是打開數(shù)據(jù)庫,讀取數(shù)據(jù),并以此數(shù)據(jù)形成數(shù)據(jù)Bar圖:
?1private?void?Page_Load(object?sender,?System.EventArgs?e)
?2????????{
?3????????????//?在此處放置用戶代碼以初始化頁面
?4
?5????????????string?sRouter?=?"c:\\db2.mdb"?;
?6????????????//獲得當(dāng)前Access數(shù)據(jù)庫在服務(wù)器端的絕對路徑
?7
?8????????????string?strCon?=?"?Provider?=?Microsoft.Jet.OLEDB.4.0;?Data?Source?=?"?+?sRouter?;
?9????????????//創(chuàng)建一個數(shù)據(jù)庫連接
10
11????????????OleDbConnection?myConn?=?new?OleDbConnection?(?strCon?)?;
12????????????string?strCom?=?"?SELECT?YF?,SL?FROM?MonthSale?ORDER?BY?YF"?;
13????????????myConn.Open?(?)?;
14????????????OleDbCommand?myCommand?=?new?OleDbCommand?(?strCom?,?myConn?)?;
15????????????OleDbDataReader?myOleDbDataReader?=?myCommand.ExecuteReader?(?)?;
16????????????//創(chuàng)建OleDbDataReader實(shí)例,并以此實(shí)例來獲取數(shù)據(jù)庫中各條記錄數(shù)據(jù)
17
18????????????int?[?]?iXiaoSH?=?new?int?[?12?]?;
19????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售數(shù)據(jù)
20
21????????????string?[?]?sMoth?=?new?string?[?12?]?;
22????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售月份
23
24????????????int?iIndex?=?0?;
25????????????while?(?myOleDbDataReader.Read?(?)?)?
26????????????{
27????????????????iXiaoSH?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?1?)?;
28????????????????sMoth?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?0?)?.?ToString?(?)?+?"月"?;
29????????????????iIndex++?;
30????????????}
31????????????//讀取Table01數(shù)據(jù)表中的各條數(shù)據(jù),并存放在先前定義的二個數(shù)組中
32
33????????????myConn?.?Close?(?)?;
34????????????myOleDbDataReader?.?Close?(?)?;
35????????????//關(guān)閉各種資源
36
37????????????Bitmap?bm?=?new?Bitmap?(?600?,?250?)?;
38????????????//創(chuàng)建一個長度為600,寬帶為250的Bitmap實(shí)例
39
40????????????Graphics?g?;
41????????????g?=?Graphics.FromImage?(?bm?)?;
42????????????//由此Bitmap實(shí)例創(chuàng)建Graphic實(shí)例
43
44????????????g?.?Clear?(?Color.Snow)?;
45????????????//用Snow色彩為背景色填充此繪畫圖面
46
47????????????g?.?DrawString?(?"?××公司××××年度銷售情況統(tǒng)計(jì)表"?,?new?Font?(?"黑體"?,?16?)?,?Brushes?.?Black?,?new?Point?(?5?,?5?)?)?;
48????????????//在繪畫圖面的指定位置,以指定的字體、指定的顏色繪制指定的字符串。即為圖表標(biāo)題
49
50????????????//以下代碼是是實(shí)現(xiàn)圖右上部
51????????????Point?myRec?=?new?Point?(?535?,?30?)?;
52????????????Point?myDec?=?new?Point?(?560?,?26?)?;
53
54????????????//以上是在圖01中為下面繪制定位
55????????????g?.?DrawString?(?"單位:萬套"?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?new?Point?(?525?,?12?)?)?;
56???
57???
58????????????for?(?int?i?=?0?;?i?<?sMoth.Length?;?i++?)?
59????????????{
60????????????????g?.?DrawRectangle?(?Pens.Black?,?myRec?.?X?,?myRec?.?Y?,?20?,?10?)?;
61????????????????//繪制小方塊
62
63????????????????g?.?FillRectangle?(?new?SolidBrush?(?GetColor?(?i?)?)?,?myRec.X?,?myRec.Y?,?20?,?10?)?;
64????????????????//填充小方塊
65
66????????????????g?.?DrawString?(?sMoth?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?myDec?)?;
67????????????????//繪制小方塊右邊的文字
68
69????????????????myRec?.?Y?+=?15?;
70????????????????myDec?.?Y?+=?15?;
71????????????}
72
73????????????//以下代碼是繪制Bar圖,及其銷售數(shù)量
74????????????int?iBarWidth?=?40?;
75????????????int?scale?=?10?;
76????????????for?(?int?i?=?0?;?i?<?iXiaoSH?.?Length?;?i++?)?
77????????????{
78????????????????g?.?DrawRectangle?(?Pens.Black,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
79????????????????//繪制Bar圖
80
81????????????????g?.?FillRectangle?(?new?SolidBrush?(GetColor?(?i?))?,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
82????????????????//以指定的色彩填充Bar圖
83
84????????????????g?.?DrawString?(?iXiaoSH?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?(?i?*?iBarWidth?)?+?20?,?235?-?(?iXiaoSH?[?i?]?*?scale?)?)?;
85????????????????//顯示Bar圖代表的數(shù)據(jù)
86????????????}
87
88????????????//以下代碼是繪制邊框,并形成Jpeg文件,供瀏覽器顯示出來
89????????????Pen?p?=?new?Pen?(?Color.Black?,?2?)?;
90????????????g?.?DrawRectangle?(?p?,?1?,?1?,?598?,?248?)?;
91????????????bm.Save?(?Response?.?OutputStream?,?ImageFormat.Gif)?;
92????????}
9. WebForm1.aspx.cs文件中的InitializeComponent過程之后,添加下列代碼,下列代碼的作用是定義一個名稱為GetColor函數(shù),此函數(shù)的功能根據(jù)索引號得到相應(yīng)的系統(tǒng)顏色:
?1/**////?<summary>
?2????????///?獲取顏色
?3????????///?</summary>
?4????????///?<param?name="itemIndex">數(shù)組的索引</param>
?5????????///?<returns></returns>
?6????????private?Color?GetColor?(?int?itemIndex?)?
?7????????{
?8 ????????????Color?MyColor?;
?9 ????????????int?i?=?itemIndex?;
10????????????switch?(i)?
11 ????????????{
12 ????????????????case?0?:
13 ????????????????MyColor?=?Color.Green;
14 ????????????????return?MyColor;
15 ????????????????case?1?:
16 ????????????????MyColor?=?Color.Red;
17 ?????????????????return?MyColor;
18 ????????????????case?2:
19 ????????????????MyColor?=?Color.Yellow;
20 ????????????????return?MyColor;
21 ????????????????case?3?:
22 ????????????????MyColor?=?Color.Blue;
23 ????????????????return?MyColor;
24 ????????????????case?4?:
25 ????????????????MyColor?=?Color.Orange;
26 ????????????????return?MyColor;
27??????? ????????case?5?:
28 ????????????????MyColor?=?Color.Aqua;
29 ????????????????return?MyColor;
30 ????????????????case?6:
31 ????????????????MyColor?=?Color.SkyBlue;
32 ????????????????return?MyColor;
33 ????????????????case?7:
34 ????????????????MyColor?=?Color.DeepPink;
35 ????????????????return?MyColor;
36 ????????????????case?8:
37 ????????????????MyColor?=?Color.Azure;
38 ????????????????return?MyColor;
39 ????????????????case?9:
40 ????????????????MyColor?=?Color.Brown;
41 ????????????????return?MyColor;
42 ????????????????case?10:
43 ????????????????MyColor?=?Color.Pink;
44 ????????????????return?MyColor;
45 ????????????????case?11:
46 ????????????????MyColor?=?Color.BurlyWood;
47 ????????????????return?MyColor;
48 ????????????????case?12:
49 ????????????????MyColor?=?Color.Chartreuse;
50 ????????????????return?MyColor;
51 ????????????????default:
52 ????????????????MyColor?=?Color.Pink;
53 ????????????????return?MyColor;
54????????????}
55????????}
10. 至此,在上述步驟都正確執(zhí)行后,在ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖的全部工作就完成了。在確定上面建立的Access數(shù)據(jù)庫"db.mdb"位于C盤的根目錄中之后,單擊快捷鍵F5,就可以得到如圖01所示的數(shù)據(jù)Bar圖了。
五.總結(jié):
在ASP.NET頁面中實(shí)現(xiàn)各種圖表,其所使用的就是ASP.NET的繪圖功能,而這一功能是ASP.NET的前一個版本所不具備的。上面的這些介紹,不僅介紹了在ASP.NET繪制各種圖片的方法,還介紹了數(shù)據(jù)庫連接和從數(shù)據(jù)庫中逐條讀取記錄的方法。這些方法對您了解和掌握在ASP.NET中操作數(shù)據(jù)庫是非常有用的。
完整的例子程序:
??1using?System;
??2using?System.Collections;
??3using?System.ComponentModel;
??4using?System.Data;
??5using?System.Drawing;
??6using?System.Web;
??7using?System.Web.SessionState;
??8using?System.Web.UI;
??9using?System.Web.UI.WebControls;
?10using?System.Web.UI.HtmlControls;
?11
?12//下面程序中使用的ImageFormat類所在的命名空間
?13using?System.Drawing.Imaging;
?14//下面程序中使用到關(guān)于數(shù)據(jù)庫方面的類所在的命名空間
?15using?System.Data.OleDb;
?16
?17namespace?WebBarDemo
?18{
?19????/**////?<summary>
?20????///?WebForm1?的摘要說明。
?21????///?</summary>
?22????public?class?WebForm1?:?System.Web.UI.Page
?23????{
?24????????private?void?Page_Load(object?sender,?System.EventArgs?e)
?25????????{
?26????????????//?在此處放置用戶代碼以初始化頁面
?27
?28????????????string?sRouter?=?"c:\\db2.mdb"?;
?29????????????//獲得當(dāng)前Access數(shù)據(jù)庫在服務(wù)器端的絕對路徑
?30
?31????????????string?strCon?=?"?Provider?=?Microsoft.Jet.OLEDB.4.0;?Data?Source?=?"?+?sRouter?;
?32????????????//創(chuàng)建一個數(shù)據(jù)庫連接
?33
?34????????????OleDbConnection?myConn?=?new?OleDbConnection?(?strCon?)?;
?35????????????string?strCom?=?"?SELECT?YF?,SL?FROM?MonthSale?ORDER?BY?YF"?;
?36????????????myConn.Open?(?)?;
?37????????????OleDbCommand?myCommand?=?new?OleDbCommand?(?strCom?,?myConn?)?;
?38????????????OleDbDataReader?myOleDbDataReader?=?myCommand.ExecuteReader?(?)?;
?39????????????//創(chuàng)建OleDbDataReader實(shí)例,并以此實(shí)例來獲取數(shù)據(jù)庫中各條記錄數(shù)據(jù)
?40
?41????????????int?[?]?iXiaoSH?=?new?int?[?12?]?;
?42????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售數(shù)據(jù)
?43
?44????????????string?[?]?sMoth?=?new?string?[?12?]?;
?45????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售月份
?46
?47????????????int?iIndex?=?0?;
?48????????????while?(?myOleDbDataReader.Read?(?)?)?
?49????????????{
?50????????????????iXiaoSH?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?1?)?;
?51????????????????sMoth?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?0?)?.?ToString?(?)?+?"月"?;
?52????????????????iIndex++?;
?53????????????}
?54????????????//讀取Table01數(shù)據(jù)表中的各條數(shù)據(jù),并存放在先前定義的二個數(shù)組中
?55
?56????????????myConn?.?Close?(?)?;
?57????????????myOleDbDataReader?.?Close?(?)?;
?58????????????//關(guān)閉各種資源
?59
?60????????????Bitmap?bm?=?new?Bitmap?(?600?,?250?)?;
?61????????????//創(chuàng)建一個長度為600,寬帶為250的Bitmap實(shí)例
?62
?63????????????Graphics?g?;
?64????????????g?=?Graphics.FromImage?(?bm?)?;
?65????????????//由此Bitmap實(shí)例創(chuàng)建Graphic實(shí)例
?66
?67????????????g?.?Clear?(?Color.Snow)?;
?68????????????//用Snow色彩為背景色填充此繪畫圖面
?69
?70????????????g?.?DrawString?(?"?××公司××××年度銷售情況統(tǒng)計(jì)表"?,?new?Font?(?"黑體"?,?16?)?,?Brushes?.?Black?,?new?Point?(?5?,?5?)?)?;
?71????????????//在繪畫圖面的指定位置,以指定的字體、指定的顏色繪制指定的字符串。即為圖表標(biāo)題
?72
?73????????????//以下代碼是是實(shí)現(xiàn)圖右上部
?74????????????Point?myRec?=?new?Point?(?535?,?30?)?;
?75????????????Point?myDec?=?new?Point?(?560?,?26?)?;
?76
?77????????????//以上是在圖01中為下面繪制定位
?78????????????g?.?DrawString?(?"單位:萬套"?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?new?Point?(?525?,?12?)?)?;
?79???
?80???
?81????????????for?(?int?i?=?0?;?i?<?sMoth.Length?;?i++?)?
?82????????????{
?83????????????????g?.?DrawRectangle?(?Pens.Black?,?myRec?.?X?,?myRec?.?Y?,?20?,?10?)?;
?84????????????????//繪制小方塊
?85
?86????????????????g?.?FillRectangle?(?new?SolidBrush?(?GetColor?(?i?)?)?,?myRec.X?,?myRec.Y?,?20?,?10?)?;
?87????????????????//填充小方塊
?88
?89????????????????g?.?DrawString?(?sMoth?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?myDec?)?;
?90????????????????//繪制小方塊右邊的文字
?91
?92????????????????myRec?.?Y?+=?15?;
?93????????????????myDec?.?Y?+=?15?;
?94????????????}
?95
?96????????????//以下代碼是繪制Bar圖,及其銷售數(shù)量
?97????????????int?iBarWidth?=?40?;
?98????????????int?scale?=?10?;
?99????????????for?(?int?i?=?0?;?i?<?iXiaoSH?.?Length?;?i++?)?
100????????????{
101????????????????g?.?DrawRectangle?(?Pens.Black,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
102????????????????//繪制Bar圖
103
104????????????????g?.?FillRectangle?(?new?SolidBrush?(GetColor?(?i?))?,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
105????????????????//以指定的色彩填充Bar圖
106
107????????????????g?.?DrawString?(?iXiaoSH?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?(?i?*?iBarWidth?)?+?20?,?235?-?(?iXiaoSH?[?i?]?*?scale?)?)?;
108????????????????//顯示Bar圖代表的數(shù)據(jù)
109????????????}
110
111????????????//以下代碼是繪制邊框,并形成Jpeg文件,供瀏覽器顯示出來
112????????????Pen?p?=?new?Pen?(?Color.Black?,?2?)?;
113????????????g?.?DrawRectangle?(?p?,?1?,?1?,?598?,?248?)?;
114????????????bm.Save?(?Response?.?OutputStream?,?ImageFormat.Gif)?;
115????????}
116
117????????Web?窗體設(shè)計(jì)器生成的代碼#region?Web?窗體設(shè)計(jì)器生成的代碼
118????????override?protected?void?OnInit(EventArgs?e)
119????????{
120????????????//
121????????????//?CODEGEN:?該調(diào)用是?ASP.NET?Web?窗體設(shè)計(jì)器所必需的。
122????????????//
123????????????InitializeComponent();
124????????????base.OnInit(e);
125????????}
126????????
127????????/**////?<summary>
128????????///?設(shè)計(jì)器支持所需的方法?-?不要使用代碼編輯器修改
129????????///?此方法的內(nèi)容。
130????????///?</summary>
131????????private?void?InitializeComponent()
132????????{????
133????????????this.Load?+=?new?System.EventHandler(this.Page_Load);
134????????}
135????????#endregion
136????????
137????????/**////?<summary>
138????????///?獲取顏色
139????????///?</summary>
140????????///?<param?name="itemIndex">數(shù)組的索引</param>
141????????///?<returns></returns>
142????????private?Color?GetColor?(?int?itemIndex?)?
143????????{
144 ????????????Color?MyColor?;
145 ????????????int?i?=?itemIndex?;
146????????????switch?(i)?
147 ????????????{
148 ????????????????case?0?:
149 ????????????????MyColor?=?Color.Green;
150 ????????????????return?MyColor;
151 ????????????????case?1?:
152 ????????????????MyColor?=?Color.Red;
153 ?????????????????return?MyColor;
154 ????????????????case?2:
155 ????????????????MyColor?=?Color.Yellow;
156 ????????????????return?MyColor;
157 ????????????????case?3?:
158 ????????????????MyColor?=?Color.Blue;
159 ????????????????return?MyColor;
160 ????????????????case?4?:
161 ????????????????MyColor?=?Color.Orange;
162 ????????????????return?MyColor;
163??????? ????????case?5?:
164 ????????????????MyColor?=?Color.Aqua;
165 ????????????????return?MyColor;
166 ????????????????case?6:
167 ????????????????MyColor?=?Color.SkyBlue;
168 ????????????????return?MyColor;
169 ????????????????case?7:
170 ????????????????MyColor?=?Color.DeepPink;
171 ????????????????return?MyColor;
172 ????????????????case?8:
173 ????????????????MyColor?=?Color.Azure;
174 ????????????????return?MyColor;
175 ????????????????case?9:
176 ????????????????MyColor?=?Color.Brown;
177 ????????????????return?MyColor;
178 ????????????????case?10:
179 ????????????????MyColor?=?Color.Pink;
180 ????????????????return?MyColor;
181 ????????????????case?11:
182 ????????????????MyColor?=?Color.BurlyWood;
183 ????????????????return?MyColor;
184 ????????????????case?12:
185 ????????????????MyColor?=?Color.Chartreuse;
186 ????????????????return?MyColor;
187 ????????????????default:
188 ????????????????MyColor?=?Color.Pink;
189 ????????????????return?MyColor;
190????????????}
191????????}
192
193????}
194}
195
本文就是介紹在ASP.NET頁面中實(shí)現(xiàn)Bar圖的具體方法。希望本篇文章能夠讓您領(lǐng)會到ASP.NET中強(qiáng)大的繪圖功能,而我們知道圖表只有在和數(shù)據(jù)庫關(guān)聯(lián)以后,才能夠顯示出更強(qiáng)大的優(yōu)勢。下面就來介紹在ASP.NET頁面中從數(shù)據(jù)庫中提起數(shù)據(jù),并以此數(shù)據(jù)形成Bar圖的具體實(shí)現(xiàn)方法。
一.本文程序設(shè)計(jì)和運(yùn)行的軟件環(huán)境:
(1).微軟公司視窗2000服務(wù)器版。
(2).Visual Studio .Net正式版,.Net FrameWork SDK版本號3705。
(3).MDAC 2.6(Microsoft Data Acess Component)以上版本。
二.建立數(shù)據(jù)源
為了方便起見,本文選擇的數(shù)據(jù)庫類型為本地?cái)?shù)據(jù)庫--Access 2000,如果你使用的是其他數(shù)據(jù)庫類型,只需對下面介紹的程序中的關(guān)于數(shù)據(jù)庫連接的代碼進(jìn)行相應(yīng)的修改就可以了。Access數(shù)據(jù)庫名稱為"db2.mdb",在此數(shù)據(jù)庫中只定義了一張數(shù)據(jù)表"MonthSale",此表的結(jié)構(gòu)如表01所示:
| 字段名稱 | 類型 | 說明 |
| ID | 自動編號 | 主鍵 ,遞增 |
| YF | 數(shù)字 | 銷售月份 |
| SL | 數(shù)字 | 銷量 |
在定義完"db2.mdb"數(shù)據(jù)庫中的"MonthSale"數(shù)據(jù)表后,在MonthSale數(shù)據(jù)表中按照表02所示添加記錄:
| ID | YF | SL |
| 1 | 1 | 12 |
| 2 | 2 | 5 |
| 3 | 3 | 7 |
| 4 | 4 | 20 |
| 5 | 5 | 16 |
| 6 | 6 | 10 |
| 7 | 7 | 19 |
| 8 | 8 | 8 |
| 9 | 9 | 7 |
| 10 | 10 | 13 |
| 11 | 11 | 11 |
| 12 | 12 | 15 |
在MonthSale數(shù)據(jù)表中添加完這12條記錄后,保存"db2.mdb"數(shù)據(jù)庫到C盤的根目錄中。
三.ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖的關(guān)鍵步驟及其實(shí)現(xiàn)方法:
在ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖首先必須解決二大問題:
(1).首先要解決在ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)庫連接和從數(shù)據(jù)庫中讀取數(shù)據(jù)的方法。
程序要實(shí)現(xiàn)從數(shù)據(jù)庫中一條條的讀取數(shù)據(jù),則要使用OleDbDataReader類,OleDbDataReader類提供了從數(shù)據(jù)庫中逐條讀取數(shù)據(jù)的方法。下面代碼是連接C盤根目錄下的"db2.mdb"數(shù)據(jù)庫,逐條讀取MonthSale數(shù)據(jù)表中的記錄,并把數(shù)據(jù)存放到定義的二個數(shù)組中:
?1string?sRouter?=?"c:\\db2.mdb"?;
?2????????????//獲得當(dāng)前Access數(shù)據(jù)庫在服務(wù)器端的絕對路徑
?3
?4????????????string?strCon?=?"?Provider?=?Microsoft.Jet.OLEDB.4.0;?Data?Source?=?"?+?sRouter?;
?5????????????//創(chuàng)建一個數(shù)據(jù)庫連接
?6
?7????????????OleDbConnection?myConn?=?new?OleDbConnection?(?strCon?)?;
?8????????????string?strCom?=?"?SELECT?YF?,SL?FROM?MonthSale?ORDER?BY?YF"?;
?9????????????myConn.Open?(?)?;
10????????????OleDbCommand?myCommand?=?new?OleDbCommand?(?strCom?,?myConn?)?;
11????????????OleDbDataReader?myOleDbDataReader?=?myCommand.ExecuteReader?(?)?;
12????????????//創(chuàng)建OleDbDataReader實(shí)例,并以此實(shí)例來獲取數(shù)據(jù)庫中各條記錄數(shù)據(jù)
13
14????????????int?[?]?iXiaoSH?=?new?int?[?12?]?;
15????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售數(shù)據(jù)
16
17????????????string?[?]?sMoth?=?new?string?[?12?]?;
18????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售月份
19
20????????????int?iIndex?=?0?;
21????????????while?(?myOleDbDataReader.Read?(?)?)?
22????????????{
23????????????????iXiaoSH?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?1?)?;
24????????????????sMoth?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?0?)?.?ToString?(?)?+?"月"?;
25????????????????iIndex++?;
26????????????}
27????????????//讀取Table01數(shù)據(jù)表中的各條數(shù)據(jù),并存放在先前定義的二個數(shù)組中
28
29????????????myConn?.?Close?(?)?;
30????????????myOleDbDataReader?.?Close?(?)?;
31????????????//關(guān)閉各種資源
(2).根據(jù)得到數(shù)據(jù),繪制圖片,并顯示出來:
通過第一步,已經(jīng)把從數(shù)據(jù)庫中的讀取的數(shù)據(jù)存放到"iXiaoSH"和"sMoth"數(shù)組中。下面就要解決依據(jù)這些數(shù)據(jù)繪制出Bar圖?首先先了解一下在ASP.NET頁面中將要實(shí)現(xiàn)的數(shù)據(jù)Bar圖的模樣。具體可如圖01所示:
圖01:在ASP.NET中實(shí)現(xiàn)的數(shù)據(jù)Bar圖
程序中把圖01所示各個元素,按照區(qū)域分成了五個部分,這五個部分將在后面介紹的程序中分別實(shí)現(xiàn):
1. 構(gòu)建整個圖片
首先要創(chuàng)建一Bitmap實(shí)例,并以此來構(gòu)建一個Graphics實(shí)例,Graphics實(shí)例提供了各種繪制方法,這樣才能按照數(shù)據(jù)的要求在Bitmap實(shí)例上繪制各種圖形。下面代碼是在ASP.NET中創(chuàng)建Bitmap實(shí)例,并以此實(shí)例來構(gòu)建 Graphics實(shí)例的具體方法:
1Bitmap?bm?=?new?Bitmap?(?600?,?250?)?;
2????????????//創(chuàng)建一個長度為600,寬帶為250的Bitmap實(shí)例
3
4????????????Graphics?g?;
5????????????g?=?Graphics.FromImage?(?bm?)?;
6????????????//由此Bitmap實(shí)例創(chuàng)建Graphic實(shí)例
7
8????????????g?.?Clear?(?Color.Snow)?;
9????????????//用Snow色彩為背景色填充此繪畫圖面2. 圖01中的標(biāo)題部分文字:
這是通過Graphics實(shí)例中提供的DrawString方法以指定的字體、顏色、在指定的位置繪制指定的字符串。下面代碼的作用是繪制圖01中標(biāo)題:
1g?.?DrawString?(?"?××公司××××年度銷售情況統(tǒng)計(jì)表"?,?new?Font?(?"黑體"?,?16?)?,?Brushes?.?Black?,?new?Point?(?5?,?5?)?)?;
2????????????//在繪畫圖面的指定位置,以指定的字體、指定的顏色繪制指定的字符串。即為圖表標(biāo)題
33. 圖01中的提示區(qū)域,即圖01中的右上角顯示的內(nèi)容:
要繪制這部分內(nèi)容首先要定位,可以把這部分要繪制的內(nèi)容分成三個小部分:
其一,是圖01中的"單位:萬套"文字,這部分處理起來比較簡單,當(dāng)選定要在圖片中輸出的文字坐標(biāo)后,調(diào)用Graphics實(shí)例中提供的DrawString方法就可以了;
其二,是繪制圖01中的小方塊,首先要調(diào)用Graphics實(shí)例中的DrawRectangle方法在指定位置,以指定的顏色,繪制指定大小的方塊,然后再條約Graphics實(shí)例中的FillRectangle填充這個小方塊就完成了;
其三,是繪制小方塊右邊的文字。同樣要使用Graphics實(shí)例中提供的DrawString方法,只不過位置坐標(biāo)和字體要進(jìn)行相應(yīng)改變罷了。下面代碼功能是繪制圖01右上角顯示的內(nèi)容:
?1//以下代碼是是實(shí)現(xiàn)圖右上部
?2????????????Point?myRec?=?new?Point?(?535?,?30?)?;
?3????????????Point?myDec?=?new?Point?(?560?,?26?)?;
?4
?5????????????//以上是在圖01中為下面繪制定位
?6????????????g?.?DrawString?(?"單位:萬套"?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?new?Point?(?525?,?12?)?)?;
?7???
?8???
?9????????????for?(?int?i?=?0?;?i?<?sMoth.Length?;?i++?)?
10????????????{
11????????????????g?.?DrawRectangle?(?Pens.Black?,?myRec?.?X?,?myRec?.?Y?,?20?,?10?)?;
12????????????????//繪制小方塊
13
14????????????????g?.?FillRectangle?(?new?SolidBrush?(?GetColor?(?i?)?)?,?myRec.X?,?myRec.Y?,?20?,?10?)?;
15????????????????//填充小方塊
16
17????????????????g?.?DrawString?(?sMoth?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?myDec?)?;
18????????????????//繪制小方塊右邊的文字
19
20????????????????myRec?.?Y?+=?15?;
21????????????????myDec?.?Y?+=?15?;
22????????????}
4. 根據(jù)從數(shù)據(jù)庫中讀取的數(shù)據(jù),繪制數(shù)據(jù)Bar圖:
此部分與第三部分比較類似,最主要的區(qū)別在于,繪制的位置不相同,下面代碼是在圖01中繪制數(shù)據(jù)Bar圖,并提示Bar圖所代表的數(shù)量:
?
?1//以下代碼是繪制Bar圖,及其銷售數(shù)量?2????????????int?iBarWidth?=?40?;
?3????????????int?scale?=?10?;
?4????????????for?(?int?i?=?0?;?i?<?iXiaoSH?.?Length?;?i++?)?
?5????????????{
?6????????????????g?.?DrawRectangle?(?Pens.Black,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
?7????????????????//繪制Bar圖
?8
?9????????????????g?.?FillRectangle?(?new?SolidBrush?(GetColor?(?i?))?,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
10????????????????//以指定的色彩填充Bar圖
11
12????????????????g?.?DrawString?(?iXiaoSH?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?(?i?*?iBarWidth?)?+?20?,?235?-?(?iXiaoSH?[?i?]?*?scale?)?)?;
13????????????????//顯示Bar圖代表的數(shù)據(jù)
14????????????}5. 繪制圖片邊框,并形成Jpeg文件格式在客戶端顯示:
繪制圖片邊框,使用的Graphics實(shí)例中的DrawRectangle方法。至于采用Jpeg格式文件在客戶端顯示,是因?yàn)镴peg文件占用的空間較小,利于網(wǎng)絡(luò)傳送。下面代碼是繪制圖01中的邊框,并形成Jpeg文件:
1//以下代碼是繪制邊框,并形成Jpeg文件,供瀏覽器顯示出來
2????????????Pen?p?=?new?Pen?(?Color.Black?,?2?)?;
3????????????g?.?DrawRectangle?(?p?,?1?,?1?,?598?,?248?)?;
4????????????bm.Save?(?Response?.?OutputStream?,?ImageFormat.Gif)?;
四.ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖實(shí)現(xiàn)步驟:
掌握了上面的關(guān)鍵步驟及其解決方法后,在ASP.NET實(shí)現(xiàn)數(shù)據(jù)Bar相對就容易許多了,下面是ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖的具體實(shí)現(xiàn)步驟,在開發(fā)工具上選用的是Visual Stuido .Net企業(yè)構(gòu)建版,采用的開發(fā)語言是C#。
1. 啟動Visual Studio .Net
2. 選擇菜單【文件】|【新建】|【項(xiàng)目】后,彈出【新建項(xiàng)目】對話框
3. 將【項(xiàng)目類型】設(shè)置為【Visual C#項(xiàng)目】
4. 將【模板】設(shè)置為【ASP.NET Web 應(yīng)用程序】
5. 在【位置】的文本框中輸入"http://localhost/Bar"。然后單擊【確定】按鈕,這樣在Visual Studio .Net就會在當(dāng)前項(xiàng)目文件所在目錄中建立一個名稱為"WebBarDemo"文件夾,里面存放是此項(xiàng)目的項(xiàng)目文件,項(xiàng)目中的其他文件存放的位置是計(jì)算機(jī)Internet信息服務(wù)的默認(rèn)的Web站點(diǎn)所在的目錄中新建的一個名稱為"WebBarDemo"的文件夾中。具體如圖02所示:
圖02:新建一個ASP.NET項(xiàng)目對話框
6. 把Visual Studio .Net的當(dāng)前窗口切換到WebForm的代碼編輯窗口,即:WebForm1.aspx.cs文件的編輯窗口。
7. 在WebForm1.aspx.cs文件首部,用下列代碼替換WebForm1.aspx.cs中導(dǎo)入命名空間的代碼
1//下面程序中使用的ImageFormat類所在的命名空間
2using?System.Drawing.Imaging;
3//下面程序中使用到關(guān)于數(shù)據(jù)庫方面的類所在的命名空間
4using?System.Data.OleDb; 8. WebForm1.aspx.cs文件中的Page_Load事件處理代碼中添加下列代碼,下列代碼的作用是打開數(shù)據(jù)庫,讀取數(shù)據(jù),并以此數(shù)據(jù)形成數(shù)據(jù)Bar圖:
?1private?void?Page_Load(object?sender,?System.EventArgs?e)
?2????????{
?3????????????//?在此處放置用戶代碼以初始化頁面
?4
?5????????????string?sRouter?=?"c:\\db2.mdb"?;
?6????????????//獲得當(dāng)前Access數(shù)據(jù)庫在服務(wù)器端的絕對路徑
?7
?8????????????string?strCon?=?"?Provider?=?Microsoft.Jet.OLEDB.4.0;?Data?Source?=?"?+?sRouter?;
?9????????????//創(chuàng)建一個數(shù)據(jù)庫連接
10
11????????????OleDbConnection?myConn?=?new?OleDbConnection?(?strCon?)?;
12????????????string?strCom?=?"?SELECT?YF?,SL?FROM?MonthSale?ORDER?BY?YF"?;
13????????????myConn.Open?(?)?;
14????????????OleDbCommand?myCommand?=?new?OleDbCommand?(?strCom?,?myConn?)?;
15????????????OleDbDataReader?myOleDbDataReader?=?myCommand.ExecuteReader?(?)?;
16????????????//創(chuàng)建OleDbDataReader實(shí)例,并以此實(shí)例來獲取數(shù)據(jù)庫中各條記錄數(shù)據(jù)
17
18????????????int?[?]?iXiaoSH?=?new?int?[?12?]?;
19????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售數(shù)據(jù)
20
21????????????string?[?]?sMoth?=?new?string?[?12?]?;
22????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售月份
23
24????????????int?iIndex?=?0?;
25????????????while?(?myOleDbDataReader.Read?(?)?)?
26????????????{
27????????????????iXiaoSH?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?1?)?;
28????????????????sMoth?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?0?)?.?ToString?(?)?+?"月"?;
29????????????????iIndex++?;
30????????????}
31????????????//讀取Table01數(shù)據(jù)表中的各條數(shù)據(jù),并存放在先前定義的二個數(shù)組中
32
33????????????myConn?.?Close?(?)?;
34????????????myOleDbDataReader?.?Close?(?)?;
35????????????//關(guān)閉各種資源
36
37????????????Bitmap?bm?=?new?Bitmap?(?600?,?250?)?;
38????????????//創(chuàng)建一個長度為600,寬帶為250的Bitmap實(shí)例
39
40????????????Graphics?g?;
41????????????g?=?Graphics.FromImage?(?bm?)?;
42????????????//由此Bitmap實(shí)例創(chuàng)建Graphic實(shí)例
43
44????????????g?.?Clear?(?Color.Snow)?;
45????????????//用Snow色彩為背景色填充此繪畫圖面
46
47????????????g?.?DrawString?(?"?××公司××××年度銷售情況統(tǒng)計(jì)表"?,?new?Font?(?"黑體"?,?16?)?,?Brushes?.?Black?,?new?Point?(?5?,?5?)?)?;
48????????????//在繪畫圖面的指定位置,以指定的字體、指定的顏色繪制指定的字符串。即為圖表標(biāo)題
49
50????????????//以下代碼是是實(shí)現(xiàn)圖右上部
51????????????Point?myRec?=?new?Point?(?535?,?30?)?;
52????????????Point?myDec?=?new?Point?(?560?,?26?)?;
53
54????????????//以上是在圖01中為下面繪制定位
55????????????g?.?DrawString?(?"單位:萬套"?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?new?Point?(?525?,?12?)?)?;
56???
57???
58????????????for?(?int?i?=?0?;?i?<?sMoth.Length?;?i++?)?
59????????????{
60????????????????g?.?DrawRectangle?(?Pens.Black?,?myRec?.?X?,?myRec?.?Y?,?20?,?10?)?;
61????????????????//繪制小方塊
62
63????????????????g?.?FillRectangle?(?new?SolidBrush?(?GetColor?(?i?)?)?,?myRec.X?,?myRec.Y?,?20?,?10?)?;
64????????????????//填充小方塊
65
66????????????????g?.?DrawString?(?sMoth?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?myDec?)?;
67????????????????//繪制小方塊右邊的文字
68
69????????????????myRec?.?Y?+=?15?;
70????????????????myDec?.?Y?+=?15?;
71????????????}
72
73????????????//以下代碼是繪制Bar圖,及其銷售數(shù)量
74????????????int?iBarWidth?=?40?;
75????????????int?scale?=?10?;
76????????????for?(?int?i?=?0?;?i?<?iXiaoSH?.?Length?;?i++?)?
77????????????{
78????????????????g?.?DrawRectangle?(?Pens.Black,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
79????????????????//繪制Bar圖
80
81????????????????g?.?FillRectangle?(?new?SolidBrush?(GetColor?(?i?))?,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
82????????????????//以指定的色彩填充Bar圖
83
84????????????????g?.?DrawString?(?iXiaoSH?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?(?i?*?iBarWidth?)?+?20?,?235?-?(?iXiaoSH?[?i?]?*?scale?)?)?;
85????????????????//顯示Bar圖代表的數(shù)據(jù)
86????????????}
87
88????????????//以下代碼是繪制邊框,并形成Jpeg文件,供瀏覽器顯示出來
89????????????Pen?p?=?new?Pen?(?Color.Black?,?2?)?;
90????????????g?.?DrawRectangle?(?p?,?1?,?1?,?598?,?248?)?;
91????????????bm.Save?(?Response?.?OutputStream?,?ImageFormat.Gif)?;
92????????}
9. WebForm1.aspx.cs文件中的InitializeComponent過程之后,添加下列代碼,下列代碼的作用是定義一個名稱為GetColor函數(shù),此函數(shù)的功能根據(jù)索引號得到相應(yīng)的系統(tǒng)顏色:
?1/**////?<summary>
?2????????///?獲取顏色
?3????????///?</summary>
?4????????///?<param?name="itemIndex">數(shù)組的索引</param>
?5????????///?<returns></returns>
?6????????private?Color?GetColor?(?int?itemIndex?)?
?7????????{
?8 ????????????Color?MyColor?;
?9 ????????????int?i?=?itemIndex?;
10????????????switch?(i)?
11 ????????????{
12 ????????????????case?0?:
13 ????????????????MyColor?=?Color.Green;
14 ????????????????return?MyColor;
15 ????????????????case?1?:
16 ????????????????MyColor?=?Color.Red;
17 ?????????????????return?MyColor;
18 ????????????????case?2:
19 ????????????????MyColor?=?Color.Yellow;
20 ????????????????return?MyColor;
21 ????????????????case?3?:
22 ????????????????MyColor?=?Color.Blue;
23 ????????????????return?MyColor;
24 ????????????????case?4?:
25 ????????????????MyColor?=?Color.Orange;
26 ????????????????return?MyColor;
27??????? ????????case?5?:
28 ????????????????MyColor?=?Color.Aqua;
29 ????????????????return?MyColor;
30 ????????????????case?6:
31 ????????????????MyColor?=?Color.SkyBlue;
32 ????????????????return?MyColor;
33 ????????????????case?7:
34 ????????????????MyColor?=?Color.DeepPink;
35 ????????????????return?MyColor;
36 ????????????????case?8:
37 ????????????????MyColor?=?Color.Azure;
38 ????????????????return?MyColor;
39 ????????????????case?9:
40 ????????????????MyColor?=?Color.Brown;
41 ????????????????return?MyColor;
42 ????????????????case?10:
43 ????????????????MyColor?=?Color.Pink;
44 ????????????????return?MyColor;
45 ????????????????case?11:
46 ????????????????MyColor?=?Color.BurlyWood;
47 ????????????????return?MyColor;
48 ????????????????case?12:
49 ????????????????MyColor?=?Color.Chartreuse;
50 ????????????????return?MyColor;
51 ????????????????default:
52 ????????????????MyColor?=?Color.Pink;
53 ????????????????return?MyColor;
54????????????}
55????????}
10. 至此,在上述步驟都正確執(zhí)行后,在ASP.NET頁面中實(shí)現(xiàn)數(shù)據(jù)Bar圖的全部工作就完成了。在確定上面建立的Access數(shù)據(jù)庫"db.mdb"位于C盤的根目錄中之后,單擊快捷鍵F5,就可以得到如圖01所示的數(shù)據(jù)Bar圖了。
五.總結(jié):
在ASP.NET頁面中實(shí)現(xiàn)各種圖表,其所使用的就是ASP.NET的繪圖功能,而這一功能是ASP.NET的前一個版本所不具備的。上面的這些介紹,不僅介紹了在ASP.NET繪制各種圖片的方法,還介紹了數(shù)據(jù)庫連接和從數(shù)據(jù)庫中逐條讀取記錄的方法。這些方法對您了解和掌握在ASP.NET中操作數(shù)據(jù)庫是非常有用的。
完整的例子程序:
??1using?System;
??2using?System.Collections;
??3using?System.ComponentModel;
??4using?System.Data;
??5using?System.Drawing;
??6using?System.Web;
??7using?System.Web.SessionState;
??8using?System.Web.UI;
??9using?System.Web.UI.WebControls;
?10using?System.Web.UI.HtmlControls;
?11
?12//下面程序中使用的ImageFormat類所在的命名空間
?13using?System.Drawing.Imaging;
?14//下面程序中使用到關(guān)于數(shù)據(jù)庫方面的類所在的命名空間
?15using?System.Data.OleDb;
?16
?17namespace?WebBarDemo
?18{
?19????/**////?<summary>
?20????///?WebForm1?的摘要說明。
?21????///?</summary>
?22????public?class?WebForm1?:?System.Web.UI.Page
?23????{
?24????????private?void?Page_Load(object?sender,?System.EventArgs?e)
?25????????{
?26????????????//?在此處放置用戶代碼以初始化頁面
?27
?28????????????string?sRouter?=?"c:\\db2.mdb"?;
?29????????????//獲得當(dāng)前Access數(shù)據(jù)庫在服務(wù)器端的絕對路徑
?30
?31????????????string?strCon?=?"?Provider?=?Microsoft.Jet.OLEDB.4.0;?Data?Source?=?"?+?sRouter?;
?32????????????//創(chuàng)建一個數(shù)據(jù)庫連接
?33
?34????????????OleDbConnection?myConn?=?new?OleDbConnection?(?strCon?)?;
?35????????????string?strCom?=?"?SELECT?YF?,SL?FROM?MonthSale?ORDER?BY?YF"?;
?36????????????myConn.Open?(?)?;
?37????????????OleDbCommand?myCommand?=?new?OleDbCommand?(?strCom?,?myConn?)?;
?38????????????OleDbDataReader?myOleDbDataReader?=?myCommand.ExecuteReader?(?)?;
?39????????????//創(chuàng)建OleDbDataReader實(shí)例,并以此實(shí)例來獲取數(shù)據(jù)庫中各條記錄數(shù)據(jù)
?40
?41????????????int?[?]?iXiaoSH?=?new?int?[?12?]?;
?42????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售數(shù)據(jù)
?43
?44????????????string?[?]?sMoth?=?new?string?[?12?]?;
?45????????????//定義一個數(shù)組,用以存放從數(shù)據(jù)庫中讀取的銷售月份
?46
?47????????????int?iIndex?=?0?;
?48????????????while?(?myOleDbDataReader.Read?(?)?)?
?49????????????{
?50????????????????iXiaoSH?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?1?)?;
?51????????????????sMoth?[?iIndex?]?=?myOleDbDataReader.GetInt32?(?0?)?.?ToString?(?)?+?"月"?;
?52????????????????iIndex++?;
?53????????????}
?54????????????//讀取Table01數(shù)據(jù)表中的各條數(shù)據(jù),并存放在先前定義的二個數(shù)組中
?55
?56????????????myConn?.?Close?(?)?;
?57????????????myOleDbDataReader?.?Close?(?)?;
?58????????????//關(guān)閉各種資源
?59
?60????????????Bitmap?bm?=?new?Bitmap?(?600?,?250?)?;
?61????????????//創(chuàng)建一個長度為600,寬帶為250的Bitmap實(shí)例
?62
?63????????????Graphics?g?;
?64????????????g?=?Graphics.FromImage?(?bm?)?;
?65????????????//由此Bitmap實(shí)例創(chuàng)建Graphic實(shí)例
?66
?67????????????g?.?Clear?(?Color.Snow)?;
?68????????????//用Snow色彩為背景色填充此繪畫圖面
?69
?70????????????g?.?DrawString?(?"?××公司××××年度銷售情況統(tǒng)計(jì)表"?,?new?Font?(?"黑體"?,?16?)?,?Brushes?.?Black?,?new?Point?(?5?,?5?)?)?;
?71????????????//在繪畫圖面的指定位置,以指定的字體、指定的顏色繪制指定的字符串。即為圖表標(biāo)題
?72
?73????????????//以下代碼是是實(shí)現(xiàn)圖右上部
?74????????????Point?myRec?=?new?Point?(?535?,?30?)?;
?75????????????Point?myDec?=?new?Point?(?560?,?26?)?;
?76
?77????????????//以上是在圖01中為下面繪制定位
?78????????????g?.?DrawString?(?"單位:萬套"?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?new?Point?(?525?,?12?)?)?;
?79???
?80???
?81????????????for?(?int?i?=?0?;?i?<?sMoth.Length?;?i++?)?
?82????????????{
?83????????????????g?.?DrawRectangle?(?Pens.Black?,?myRec?.?X?,?myRec?.?Y?,?20?,?10?)?;
?84????????????????//繪制小方塊
?85
?86????????????????g?.?FillRectangle?(?new?SolidBrush?(?GetColor?(?i?)?)?,?myRec.X?,?myRec.Y?,?20?,?10?)?;
?87????????????????//填充小方塊
?88
?89????????????????g?.?DrawString?(?sMoth?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?myDec?)?;
?90????????????????//繪制小方塊右邊的文字
?91
?92????????????????myRec?.?Y?+=?15?;
?93????????????????myDec?.?Y?+=?15?;
?94????????????}
?95
?96????????????//以下代碼是繪制Bar圖,及其銷售數(shù)量
?97????????????int?iBarWidth?=?40?;
?98????????????int?scale?=?10?;
?99????????????for?(?int?i?=?0?;?i?<?iXiaoSH?.?Length?;?i++?)?
100????????????{
101????????????????g?.?DrawRectangle?(?Pens.Black,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
102????????????????//繪制Bar圖
103
104????????????????g?.?FillRectangle?(?new?SolidBrush?(GetColor?(?i?))?,?(?i?*?iBarWidth?)?+?15?,?250?-?(?iXiaoSH?[?i?]?*?scale?)?,?20?,?(?iXiaoSH?[?i?]?*?scale?)?+?5?)?;
105????????????????//以指定的色彩填充Bar圖
106
107????????????????g?.?DrawString?(?iXiaoSH?[?i?]?.?ToString?(?)?,?new?Font?(?"宋體"?,?9?)?,?Brushes?.?Black?,?(?i?*?iBarWidth?)?+?20?,?235?-?(?iXiaoSH?[?i?]?*?scale?)?)?;
108????????????????//顯示Bar圖代表的數(shù)據(jù)
109????????????}
110
111????????????//以下代碼是繪制邊框,并形成Jpeg文件,供瀏覽器顯示出來
112????????????Pen?p?=?new?Pen?(?Color.Black?,?2?)?;
113????????????g?.?DrawRectangle?(?p?,?1?,?1?,?598?,?248?)?;
114????????????bm.Save?(?Response?.?OutputStream?,?ImageFormat.Gif)?;
115????????}
116
117????????Web?窗體設(shè)計(jì)器生成的代碼#region?Web?窗體設(shè)計(jì)器生成的代碼
118????????override?protected?void?OnInit(EventArgs?e)
119????????{
120????????????//
121????????????//?CODEGEN:?該調(diào)用是?ASP.NET?Web?窗體設(shè)計(jì)器所必需的。
122????????????//
123????????????InitializeComponent();
124????????????base.OnInit(e);
125????????}
126????????
127????????/**////?<summary>
128????????///?設(shè)計(jì)器支持所需的方法?-?不要使用代碼編輯器修改
129????????///?此方法的內(nèi)容。
130????????///?</summary>
131????????private?void?InitializeComponent()
132????????{????
133????????????this.Load?+=?new?System.EventHandler(this.Page_Load);
134????????}
135????????#endregion
136????????
137????????/**////?<summary>
138????????///?獲取顏色
139????????///?</summary>
140????????///?<param?name="itemIndex">數(shù)組的索引</param>
141????????///?<returns></returns>
142????????private?Color?GetColor?(?int?itemIndex?)?
143????????{
144 ????????????Color?MyColor?;
145 ????????????int?i?=?itemIndex?;
146????????????switch?(i)?
147 ????????????{
148 ????????????????case?0?:
149 ????????????????MyColor?=?Color.Green;
150 ????????????????return?MyColor;
151 ????????????????case?1?:
152 ????????????????MyColor?=?Color.Red;
153 ?????????????????return?MyColor;
154 ????????????????case?2:
155 ????????????????MyColor?=?Color.Yellow;
156 ????????????????return?MyColor;
157 ????????????????case?3?:
158 ????????????????MyColor?=?Color.Blue;
159 ????????????????return?MyColor;
160 ????????????????case?4?:
161 ????????????????MyColor?=?Color.Orange;
162 ????????????????return?MyColor;
163??????? ????????case?5?:
164 ????????????????MyColor?=?Color.Aqua;
165 ????????????????return?MyColor;
166 ????????????????case?6:
167 ????????????????MyColor?=?Color.SkyBlue;
168 ????????????????return?MyColor;
169 ????????????????case?7:
170 ????????????????MyColor?=?Color.DeepPink;
171 ????????????????return?MyColor;
172 ????????????????case?8:
173 ????????????????MyColor?=?Color.Azure;
174 ????????????????return?MyColor;
175 ????????????????case?9:
176 ????????????????MyColor?=?Color.Brown;
177 ????????????????return?MyColor;
178 ????????????????case?10:
179 ????????????????MyColor?=?Color.Pink;
180 ????????????????return?MyColor;
181 ????????????????case?11:
182 ????????????????MyColor?=?Color.BurlyWood;
183 ????????????????return?MyColor;
184 ????????????????case?12:
185 ????????????????MyColor?=?Color.Chartreuse;
186 ????????????????return?MyColor;
187 ????????????????default:
188 ????????????????MyColor?=?Color.Pink;
189 ????????????????return?MyColor;
190????????????}
191????????}
192
193????}
194}
195
總結(jié)
以上是生活随笔為你收集整理的在ASP.NET页面中实现数据柱状图的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据到入到excel和打印功能
- 下一篇: XML数据的分页显示