三層架構(gòu)設(shè)計(jì)_第1頁(yè)
三層架構(gòu)設(shè)計(jì)_第2頁(yè)
三層架構(gòu)設(shè)計(jì)_第3頁(yè)
三層架構(gòu)設(shè)計(jì)_第4頁(yè)
三層架構(gòu)設(shè)計(jì)_第5頁(yè)
已閱讀5頁(yè),還剩22頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、第八章 三層架構(gòu)設(shè)計(jì)在軟件體系架構(gòu)設(shè)計(jì)中,分層式結(jié)構(gòu)是最常見(jiàn),也是重要的一種結(jié)構(gòu)。微軟推薦的分層式結(jié)構(gòu)一般分為三層,從下至上分別為:數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層、表示層。8.1三層架構(gòu)概述與網(wǎng)絡(luò)協(xié)議是分層一樣,軟件設(shè)計(jì)也要進(jìn)行分層,分層的目的是為了實(shí)現(xiàn)“高內(nèi)聚、低耦合”,采用“分而治之”的思想,把任務(wù)劃分成子任務(wù),逐個(gè)解決,易于控制,易于延展,易于多個(gè)進(jìn)行項(xiàng)目合作。所謂的三層架構(gòu)就是將整個(gè)業(yè)務(wù)應(yīng)用劃分為表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層,由數(shù)據(jù)訪問(wèn)層去訪問(wèn)數(shù)據(jù)庫(kù),十分有利于系統(tǒng)的開(kāi)發(fā)、維護(hù)、部署和擴(kuò)展。那么我們?yōu)槭裁匆褂梅謱娱_(kāi)發(fā)呢,它有什么獨(dú)特的優(yōu)勢(shì)呢?對(duì)于簡(jiǎn)單的應(yīng)用來(lái)說(shuō),沒(méi)有必要搞得那么復(fù)雜,可以不

2、進(jìn)行分層,但是對(duì)一個(gè)大型系統(tǒng)來(lái)說(shuō)這樣的設(shè)計(jì)的缺陷就很?chē)?yán)重了。面向?qū)ο蟮某绦蛟O(shè)計(jì)模式追求的是代碼的通用性,可移植性,可維護(hù)性、功能擴(kuò)展,分層開(kāi)發(fā)這種設(shè)計(jì)模式體現(xiàn)了面向?qū)ο蟮乃枷耄陧?yè)面的后臺(tái)代碼中直接訪問(wèn)數(shù)據(jù)庫(kù),實(shí)際上是打著面向?qū)ο蟮幕献訁s依然走著面向過(guò)程的老路。試問(wèn)一下,我們用Access做后臺(tái)開(kāi)發(fā)的未分層程序,如果有一天因?yàn)閿?shù)據(jù)量的增加,安全的需要等,數(shù)據(jù)庫(kù)有Access變成了SQL Server,怎么辦?網(wǎng)頁(yè)代碼文件中的所有程序都要重新修改,整個(gè)系統(tǒng)需要重新來(lái)做,這都是設(shè)計(jì)不合理惹的禍。多層開(kāi)發(fā)架構(gòu)的出現(xiàn)很有效的解決了這樣的問(wèn)題。三層架構(gòu)中,各個(gè)層之間的分工是很明確的。面向?qū)ο舐?,就像?/p>

3、個(gè)公司中的部門(mén)一樣,每個(gè)部門(mén)的分工是不一樣的,是哪個(gè)部門(mén)的任務(wù)就有哪個(gè)部門(mén)完成,對(duì)應(yīng)的,各個(gè)部門(mén)的維護(hù)工作也是各自完成且不會(huì)影響其它的部門(mén),至少影響不是很大,否則就只能說(shuō)明分工還不合理。采用三層架構(gòu)設(shè)計(jì)系統(tǒng),各層高內(nèi)聚、低耦合,通過(guò)有效的協(xié)作來(lái)完成系統(tǒng)的高效運(yùn)行,三層架構(gòu)中出現(xiàn)上面說(shuō)的問(wèn)題,由于其將數(shù)據(jù)訪問(wèn)操作完全限定在數(shù)據(jù)訪問(wèn)層內(nèi),數(shù)據(jù)庫(kù)發(fā)生了改變,我們只需要修改數(shù)據(jù)訪問(wèn)層,其它的地方不用修改。三層架構(gòu)中各層的功能是這樣的。1、表示層(UI):通俗講就是展現(xiàn)給用戶的界面,是用戶在使用系統(tǒng)時(shí)的所見(jiàn)所得,表示層負(fù)責(zé)直接跟用戶進(jìn)行交互,用于數(shù)據(jù)錄入,數(shù)據(jù)顯示等。表示嘛,也就意味著側(cè)重于做與布局和外

4、觀顯示方面的工作,以及客戶端的驗(yàn)證和處理等,并針對(duì)用戶的請(qǐng)求去調(diào)用業(yè)務(wù)邏輯層的功能。2、業(yè)務(wù)邏輯層(BLL):針對(duì)表示層提交的請(qǐng)求,進(jìn)行邏輯處理,如果需要訪問(wèn)數(shù)據(jù)庫(kù),就調(diào)用數(shù)據(jù)訪問(wèn)層的操作,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。3、數(shù)據(jù)訪問(wèn)層(DAL):顧名思義,就是用于專(zhuān)門(mén)跟后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行交互,直接操縱數(shù)據(jù)庫(kù),實(shí)現(xiàn)數(shù)據(jù)庫(kù)記錄的增加、刪除、修改、查詢等。與具體數(shù)據(jù)庫(kù)系統(tǒng)相關(guān)的對(duì)象只在這一層被引用,如System.Data。System.Data.SqlClient等命名空間的對(duì)象,數(shù)據(jù)訪問(wèn)層之外的地方都不應(yīng)該出現(xiàn)對(duì)這些對(duì)象的引用。三層架構(gòu)的框架模型如圖8-1所示。表示層業(yè)務(wù)邏輯層實(shí)體類(lèi)SQL ServerAcce

5、ss ServerOracleServer數(shù)據(jù)訪問(wèn)層圖8-1 三層架構(gòu)框架模型理想的分層式架構(gòu),應(yīng)該是一個(gè)支持可抽取、可替換的“抽屜”式架構(gòu)。這個(gè)框架模型中,出現(xiàn)了一個(gè)自定義實(shí)體類(lèi),現(xiàn)在大家都傾向于用自定義實(shí)體數(shù)據(jù)形式在層與層之間以及層內(nèi)模塊間進(jìn)行數(shù)據(jù)傳輸。實(shí)體類(lèi)是現(xiàn)實(shí)世界中實(shí)體對(duì)象在計(jì)算機(jī)中的表示。一般來(lái)說(shuō),實(shí)體類(lèi)可以分為“貧血實(shí)體類(lèi)”和“充血實(shí)體類(lèi)”,前者僅僅保存實(shí)體的屬性,而后者還包含一些實(shí)體間的關(guān)系與邏輯。我們這里所用的實(shí)體類(lèi)都是“貧血實(shí)體類(lèi)”。大多情況下,實(shí)體類(lèi)和數(shù)據(jù)庫(kù)中的表是對(duì)應(yīng)的,實(shí)體類(lèi)的屬性和表的字段對(duì)應(yīng),但這并不是一個(gè)限制,有可以出現(xiàn)一個(gè)實(shí)體類(lèi)對(duì)應(yīng)多個(gè)表,或者交叉對(duì)應(yīng)的情況。

6、雖然現(xiàn)在分層的設(shè)計(jì)開(kāi)發(fā)中,一般都是用實(shí)體類(lèi)對(duì)應(yīng)數(shù)據(jù)庫(kù)的表。但是有些專(zhuān)家意見(jiàn)是慎用,因?yàn)槿绻褦?shù)據(jù)展示在頁(yè)面上的話,從數(shù)據(jù)庫(kù)中讀出的DataSet本身就是XML形式,數(shù)據(jù)展示也用XML,如果用了實(shí)體類(lèi)就多了一次轉(zhuǎn)化。圖7.2顯示了實(shí)體對(duì)象在三層架構(gòu)中傳遞數(shù)據(jù)的過(guò)程。 圖8-2 實(shí)體類(lèi)在三層架構(gòu)中的數(shù)據(jù)傳遞分層的思想講完了,在多人合作開(kāi)發(fā)系統(tǒng)的過(guò)程中,就可以按層來(lái)劃分任務(wù),只要設(shè)計(jì)的時(shí)候把接口定義好,開(kāi)發(fā)人員就可以同時(shí)開(kāi)發(fā),而且不會(huì)發(fā)生沖突,做前臺(tái)的人不需要關(guān)心怎么實(shí)現(xiàn)到數(shù)據(jù)庫(kù)中去查詢、更新、刪除和增加數(shù)據(jù),他們只需要去調(diào)用相應(yīng)的類(lèi)就可以了。做數(shù)據(jù)訪問(wèn)層的人也不需要知道前臺(tái)的事,定義好與其它層交互

7、的接口,規(guī)定好參數(shù)就行,各個(gè)層都一樣,做好自己的工作就可以了。這樣的系統(tǒng),清晰性、可維護(hù)性和可擴(kuò)展性都非常強(qiáng)大,測(cè)試和修改也比較方便。下面結(jié)合具體的實(shí)例,來(lái)學(xué)習(xí)三層架構(gòu)的應(yīng)用。仍以“BookShopOnNet”數(shù)據(jù)庫(kù)中顧客表“ShopUser”為例,用三層架構(gòu)的方式實(shí)現(xiàn)對(duì)它的顯示,以及增、刪、改、查等操作。顧客表的結(jié)構(gòu)為:ShopUser(UserId int IDENTITY(1,1) NOT NULL,UserName varchar(30) NOT NULL,Passwords varchar(20) NOT NULL,Email varchar(30),XinMin nvarchar(

8、5), Sex bit,Birthday datetime,Address nvarchar(50),Tel varchar(12),Photo varchar(50),Nation nvarchar(15),Hobby varchar(50),PersonURL varchar(50)。詳細(xì)說(shuō)明請(qǐng)見(jiàn)第五章。8.2三層架構(gòu)應(yīng)用實(shí)例下面來(lái)構(gòu)建這個(gè)應(yīng)用程序解決方案。啟動(dòng)VS2010,依次單擊菜單“文件”|“新建”|“項(xiàng)目”,彈出“新建項(xiàng)目”對(duì)話框,在“已安裝的模板”下,單擊展開(kāi)“其他項(xiàng)目類(lèi)型”折疊菜單,再單擊“Visual Studio解決方案”,最后單擊右邊的“空白解決方案”,選擇好解決方案存放

9、的路徑,輸入解決方案名“ThreeLayerApp”,確定后就創(chuàng)建了一個(gè)空白解決方案。以后在這個(gè)空白解決方案中,添加各層對(duì)應(yīng)的項(xiàng)目或站點(diǎn),一個(gè)多項(xiàng)目解決方案的應(yīng)用程序就構(gòu)成了。8.2.1 實(shí)體類(lèi)設(shè)計(jì)實(shí)體類(lèi)的設(shè)計(jì)比較簡(jiǎn)單,它一般與數(shù)據(jù)庫(kù)中的表一一對(duì)應(yīng),針對(duì)每個(gè)表建一個(gè)實(shí)體類(lèi),表的字段對(duì)應(yīng)實(shí)體類(lèi)的屬性,下面以實(shí)例具體介紹。在VS中右擊解決方案資源管理器窗格中的“ThreeLayerApp”解決方案名,在彈出的快捷菜單中,依次單擊“添加”|“新建項(xiàng)目”,彈出“添加新項(xiàng)目”對(duì)話框,在“已安裝的模板”下,選中“Visual C#”,選擇右邊的“類(lèi)庫(kù)”,輸入項(xiàng)目名“BookShopModel”并確定,這樣

10、就在此解決方案下添加了一個(gè)實(shí)體類(lèi)項(xiàng)目,然后在此項(xiàng)目中添加實(shí)體類(lèi)即可。接下來(lái)在這個(gè)實(shí)體類(lèi)項(xiàng)目中逐個(gè)添加實(shí)體。右擊項(xiàng)目名“BookShopModel”,選“添加”|“類(lèi)”,輸入類(lèi)名“ShopUserModel”,它同時(shí)也做文件名,這個(gè)實(shí)體類(lèi)文件就建好了,在其中輸入類(lèi)的私有成員變量,并依據(jù)這些成員變量構(gòu)建相應(yīng)的屬性。大家應(yīng)該清楚私有成員變量和相應(yīng)屬性的關(guān)系吧,屬性實(shí)質(zhì)是訪問(wèn)器,有讀寫(xiě)特性及判斷處理功能,它本身不保存數(shù)據(jù),真正的數(shù)據(jù)是保存在它所讀寫(xiě)的私有成員變量中,屬性提高了私有成員變量的安全性。當(dāng)類(lèi)的私有成員變量輸好后,屬性可以用“重構(gòu)”|“封裝字段”的方式快速構(gòu)建,并根據(jù)屬性的讀寫(xiě)特性及是否需要判

11、斷處理功能,進(jìn)行適當(dāng)?shù)男薷模@些基本操作不再詳述。為了使類(lèi)能在項(xiàng)目外其他項(xiàng)目中訪問(wèn),把類(lèi)加“public”屬性,這樣構(gòu)建出來(lái)的顧客實(shí)體類(lèi)ShopUserModel的部分內(nèi)容如下: public class ShopUserModel private int _UserId; private string _UserName; public int UserId get return _UserId; set _UserId = value; public string UserName get return _UserName; set _UserName = value; 8.2.2 數(shù)據(jù)訪

12、問(wèn)層設(shè)計(jì)數(shù)據(jù)訪問(wèn)層是專(zhuān)門(mén)跟后臺(tái)數(shù)據(jù)庫(kù)進(jìn)行交互,直接操縱數(shù)據(jù)庫(kù),實(shí)現(xiàn)數(shù)據(jù)庫(kù)記錄的增加、刪除、修改、查詢等。首先在解決方案中添加名為“BookShopDALLayer”的數(shù)據(jù)訪問(wèn)層項(xiàng)目,操作方法仍是右擊解決方案名,依次單擊“添加”|“新建項(xiàng)目”,彈出“添加新項(xiàng)目”對(duì)話框,選中“Visual C#”右邊的“類(lèi)庫(kù)”,輸入項(xiàng)目名并確定。此項(xiàng)目產(chǎn)生后,由于其中的類(lèi)要用到前面剛創(chuàng)建的項(xiàng)目名為“BookShopModel”的實(shí)體類(lèi),所以需要添加對(duì)它的引用,否則其中的實(shí)體類(lèi)是不能被這個(gè)項(xiàng)目中的類(lèi)所訪問(wèn)的。添加引用的方法是:右擊此項(xiàng)目中的“引用”,選“添加引用”,彈出如圖8-3所示的對(duì)話框,選擇“項(xiàng)目”選擇卡,其

13、中列出了解決方案中的所有項(xiàng)目,選中實(shí)體類(lèi)項(xiàng)目后確定即可。圖8-3 添加引用對(duì)話框然后用在此項(xiàng)目中添加“類(lèi)”的方式,添加“ShopUserDAL”數(shù)據(jù)訪問(wèn)類(lèi),此類(lèi)中要進(jìn)行數(shù)據(jù)庫(kù)的訪問(wèn)操作,所以在類(lèi)的開(kāi)頭要導(dǎo)入下面的幾個(gè)命名空間,以便使用其中的類(lèi)。using System.Configuration; using System.Data;using System.Data.SqlClient;using BookShopModel;用“using BookShopModel;”導(dǎo)入這個(gè)命名空間,是因?yàn)榍懊鎰?chuàng)建實(shí)體類(lèi)時(shí),用的是默認(rèn)的命名空間,默認(rèn)命名空間就是項(xiàng)目名。這樣構(gòu)建出來(lái)的顧客表所對(duì)就的數(shù)據(jù)訪

14、問(wèn)類(lèi)ShopUserDAL的內(nèi)容如下:public class ShopUserDAL static string strconn = ConfigurationManager.ConnectionStrings"connStr".ConnectionString; SqlConnection conn; public ShopUserDAL() conn = new SqlConnection(strconn); / <summary> / 獲取顧客信息數(shù)據(jù)表視圖 / </summary> / <returns></returns

15、> public DataView GetDataView() SqlCommand comm= new SqlCommand("SELECT UserId,UserName,Passwords,Email, XinMin,Sex,Birthday,Address,Tel,Photo,Nation,Hobby,PersonURL FROM ShopUser", conn); using (SqlDataAdapter sda = new SqlDataAdapter() sda.SelectCommand = comm; DataSet ds = new DataSe

16、t(); sda.Fill(ds, "ShopUser"); return ds.Tables"ShopUser".DefaultView; public int DeleteByUserId(int UserId) string sqltext=string.Format("Delete FROM ShopUser WHERE UserId=0", UserId); using (SqlCommand comm = new SqlCommand(sqltext, conn) conn.Open(); int result = com

17、m.ExecuteNonQuery(); conn.Close(); return result; public int UpdatePartInfoByUserId(ShopUserModel objUser) string sqltext = string.Format("UPDATE ShopUser SET XinMin='1',Sex='2', Birthday='3',Email='4' WHERE UserId = 0", objUser.UserId, objUser.XinMin, objUs

18、er.Sex, objUser.Birthday, objUser.Email); using (SqlCommand comm = new SqlCommand(sqltext, conn) conn.Open(); int result = comm.ExecuteNonQuery(); conn.Close(); return result; public int UpdateByUserId(ShopUserModel objUser) string sqltext = string.Format("UPDATE ShopUser SET UserName='1

19、9;, Email='2',XinMin='3',Sex='4',Birthday='5',Address='6',Tel='7',Photo='8',Nation='9',Hobby='10',PersonURL='11' WHERE UserId = 0", objUser.UserId, objUser.UserName, objUser.Email, objUser.XinMin, objUser.Sex, objUs

20、er.Birthday, objUser.Address, objUser.Tel, objUser.Photo, objUser.Nation, objUser.Hobby, objUser.PersonURL); using (SqlCommand comm = new SqlCommand(sqltext, conn) conn.Open(); int result = comm.ExecuteNonQuery(); conn.Close(); return result; public ShopUserModel GetModelByUserId(int UserId) ShopUse

21、rModel objUser = new ShopUserModel(); string strSql = "SELECT UserId,UserName,Passwords,Email,XinMin,Sex,Birthday, Address,Tel,Photo,Nation,Hobby,PersonURL FROM ShopUser WHERE UserId =" + UserId.ToString(); using (SqlCommand comm = new SqlCommand(strSql, conn) conn.Open(); using (SqlDataRe

22、ader sdr = comm.ExecuteReader() if (sdr.Read() objUser.UserId = Convert.ToInt32(sdr"UserId".ToString(); objUser.UserName = sdr"UserName".ToString(); objUser.Passwords = sdr"Passwords".ToString(); objUser.Email = sdr"Email".ToString(); objUser.XinMin = sdr"

23、;XinMin".ToString(); if (!Convert.IsDBNull(sdr"Sex") objUser.Sex = Convert.ToBoolean(sdr"Sex"); if (!Convert.IsDBNull(sdr"Birthday") objUser.Birthday = Convert.ToDateTime(sdr"Birthday"); objUser.Address = sdr"Address".ToString(); objUser.Tel = s

24、dr"Tel".ToString(); objUser.Photo = sdr"Photo".ToString(); objUser.Nation = sdr"Nation".ToString(); objUser.Hobby = sdr"Hobby".ToString(); objUser.PersonURL = sdr"PersonURL".ToString(); sdr.Close(); conn.Close(); return objUser; 8.2.3 業(yè)務(wù)邏輯層設(shè)計(jì)業(yè)務(wù)邏輯層針對(duì)表

25、示層提交的請(qǐng)求,進(jìn)行邏輯處理,如果需要訪問(wèn)數(shù)據(jù)庫(kù),就調(diào)用數(shù)據(jù)訪問(wèn)層的操作,對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作。在解決方案中添加名為“BookShopBLLLayer”的業(yè)務(wù)邏輯層項(xiàng)目,操作方法與添加數(shù)據(jù)訪問(wèn)層類(lèi)似,仍是用添加“類(lèi)庫(kù)”的方式添加一個(gè)項(xiàng)目,輸入項(xiàng)目名并確定即定。項(xiàng)目產(chǎn)生后,要用到前面創(chuàng)建的“BookShopModel”實(shí)體類(lèi)項(xiàng)目和“BookShopDALLayer”數(shù)據(jù)訪問(wèn)類(lèi)項(xiàng)目,所以也需要添加對(duì)它們的引用,添加引用的方法與以前是一樣的。這樣構(gòu)建出來(lái)的顧客表所對(duì)就的數(shù)據(jù)訪問(wèn)類(lèi)ShopUserBLL的內(nèi)容如下: public class ShopUserBLL ShopUserDAL oShopUse

26、rDAL = new ShopUserDAL(); / <summary> / 獲?取¨?顧?客¨ª信?息¡é數(shù)ºy據(jù)Y表À¨ª視º¨®圖ª? / </summary> / <returns></returns> public DataView GetDataView() return oShopUserDAL.GetDataView(); / <summary> / 按ã¡ä

27、用®?戶¡ì編À¨¤號(hào)?刪¦?除y用®?戶¡ì / </summary> / <param name="UserId"></param> / <returns></returns> public int DeleteByUserId(int UserId) return oShopUserDAL.DeleteByUserId(UserId); / <summary> / 按ã¡

28、8;用®?戶¡ì編À¨¤號(hào)?更¨¹新?用®?戶¡ì部?分¤?信?息¡é / </summary> / <param name="objUser"></param> / <returns></returns> public int UpdatePartInfoByUserId(ShopUserModel objUser) return oShopUserDAL.UpdatePar

29、tInfoByUserId(objUser); / <summary> / 按ã¡ä用®?戶¡ì編À¨¤號(hào)?更¨¹新?用®?戶¡ì信?息¡é / </summary> / <param name="objUser"></param> / <returns></returns> public int UpdateByUserId(ShopUserM

30、odel objUser) return oShopUserDAL.UpdateByUserId(objUser); / <summary> / 按ã¡ä用®?戶¡ì編À¨¤號(hào)?獲?取¨?用®?戶¡ì實(shí)º¦Ì體¬?信?息¡é / </summary> / <param name="UserId"></param> / <returns

31、></returns> public ShopUserModel GetModelByUserId(int UserId) return oShopUserDAL.GetModelByUserId(UserId); 8.2.4 表示層設(shè)計(jì)表示層就是展現(xiàn)給用戶的界面,表示層負(fù)責(zé)直接跟用戶進(jìn)行交互,用于數(shù)據(jù)錄入,數(shù)據(jù)顯示等。在解決方案中添加名為“WebSite”的站點(diǎn)項(xiàng)目,操作方法是,右擊解決方案名,選“添加”|“新建網(wǎng)站”,選擇“ASP.NET空網(wǎng)站”,選擇站點(diǎn)存放路徑后確定即可。添加網(wǎng)面,添加控件,布局和美化界面,并編寫(xiě)相關(guān)的事件,在事件中調(diào)用底層提供的功能。GridView

32、控件GridView是ASP.NET中功能非常豐富的控件之一,它以表格的形式顯示數(shù)據(jù)庫(kù)的內(nèi)容。GridView內(nèi)置提供了選擇、排序、分頁(yè)、編輯、更新和刪除功能。1 GridView的列在一般情況下,當(dāng)為GridView設(shè)定數(shù)據(jù)源后,就可以直接顯示數(shù)據(jù)了,原因是它的lAutoGenerateColumns 屬性為T(mén)rue,GridView會(huì)使用反射來(lái)處理所有字段并按發(fā)現(xiàn)的次序自動(dòng)生成列,自動(dòng)生成列的標(biāo)題是表中的字段名,使用默認(rèn)的控件及格式。這種自動(dòng)生成列的功能對(duì)快速創(chuàng)建頁(yè)面非常有效,但缺乏靈活性。如果希望隱藏某些列,或改變顯示順序,或以自定義格式顯示,就必須設(shè)置AutoGenerateColum

33、ns屬性為False來(lái)關(guān)閉自動(dòng)生成列,手動(dòng)控制列字段的設(shè)計(jì)。GridView提供了如下7種類(lèi)型的列字段,各種列字段及其功能如下:l BoundField:以文本形式顯示數(shù)據(jù)的普通綁定列,以DataField屬性設(shè)定數(shù)據(jù)從數(shù)據(jù)源哪個(gè)字段取數(shù),用“DataFormatString”屬性來(lái)設(shè)置顯示格式。l CheckBoxField:以復(fù)選框形式顯示數(shù)據(jù),綁定到此種列的數(shù)據(jù)應(yīng)該是布爾型的,用“DataField”屬性設(shè)置數(shù)據(jù)從數(shù)據(jù)源的哪個(gè)字段中取數(shù)。l HyperLinkField:用超鏈接形式的顯示數(shù)據(jù),利用此列的“DataNavigateUrlFields”和“DataNavigateUrlFo

34、rmatString”兩個(gè)屬性,配合構(gòu)建超鏈接的URL,用“DataTextField”屬性來(lái)設(shè)置超鏈接顯示的文本。l ImageField:以Image圖象形式顯示數(shù)據(jù),列的ImageUrl屬性指出圖片源。l ButtonField:自定義按鈕列,默認(rèn)以“Button”按鈕形式顯示,通過(guò)設(shè)置它的“ButtonType”屬性,可以以鏈接按鈕或圖象按鈕形式顯示,其功能靈活,比如購(gòu)物系統(tǒng)中的“購(gòu)買(mǎi)”按鈕,圖書(shū)借閱系統(tǒng)中的“借出”等都是這種自定義按鈕。當(dāng)然“購(gòu)買(mǎi)”按鈕顯示為圖象按鈕可能顯得美觀一些。在GridView中添加的所有的ButtonField 自定義按鈕列,其事件響應(yīng)都必須寫(xiě)在GridVi

35、ew的RowCommand事件中,以CommandName來(lái)區(qū)別是哪個(gè)按鈕的響應(yīng)。l CommandField:系統(tǒng)內(nèi)置的一些數(shù)據(jù)操作按鈕,有“編輯”、“更新”、“取消”、“選擇”和“刪除”五個(gè)按鈕,它們都是“LinkButton”鏈接按鈕,它們的CommandName屬性值是固定的,含義和功能與在DataList是一樣的。l TemplateField:它實(shí)現(xiàn)自定義數(shù)據(jù)顯示,以任意你想要的HTML控件或者Web服務(wù)器控件形式顯示數(shù)據(jù),這是最靈活的處理方式。比如以文本框形式顯示數(shù)據(jù)表中的“姓名”,前6種列都無(wú)法做到,只能用模板列,在模板中用文本框?qū)崿F(xiàn)。再比如把性別顯示為單選列表框形式,也只能用

36、它實(shí)現(xiàn)。添加和編輯上面7種列的方法是,單擊右上角快捷菜單,選:“編輯列”(如圖左側(cè)所示),彈出字段設(shè)計(jì)對(duì)話框,如圖右側(cè)所示,取消“自動(dòng)生成字段”復(fù)選框,從可用字段中選取列,添加到選定的字段中。在右側(cè)的屬性窗格中,可以配置列的屬性和樣式。對(duì)于TemplateField列有兩種添加方式,一種是直接添加,另一種是把現(xiàn)有列轉(zhuǎn)換為模板列。設(shè)計(jì)GridView的項(xiàng)模板、編輯模板和頭模板GridView控件的列字段大都有HeaderText這個(gè)屬性,這個(gè)屬性是用來(lái)設(shè)置數(shù)據(jù)的表頭標(biāo)題的,如果我們不設(shè)置的話,默認(rèn)都是以數(shù)據(jù)庫(kù)的相應(yīng)字段名作為表頭標(biāo)題。還有一個(gè)DataField和DataTextFormatStr

37、ing屬性,DataField屬性用來(lái)設(shè)置要綁定顯示的數(shù)據(jù)列名,DataTextFormatString屬性用來(lái)對(duì)DataField屬性的顯示進(jìn)行格式化。例如,我們想在GridView顯示ShopUser表中的“出生日期”,應(yīng)當(dāng)先添加一個(gè)“BoundField”,然后設(shè)置此列的DataField屬性為“Birthday”,DataTextFormatString屬性為“0:yyyy-MM-DD”,HeaderText屬性為“出生日期”,則出生日期以等寬短日期格式顯示,列的標(biāo)題是“出生日期”。對(duì)于HyperLinkField列,還有DataNavigateUrlFields和DataNaviga

38、teUrlFormatString兩個(gè)屬性,它倆配合構(gòu)建超鏈接的URL。比如:DataNavigateUrlFields的屬性值為"UserId",而DataNavigateUrlFormatString屬性的值為"ShowUserDetail.aspx?UserId=0",則當(dāng)將來(lái)顯示每行數(shù)據(jù)的時(shí)候都會(huì)用該行對(duì)應(yīng)的“UserId”字段的值替換“0”,其功能類(lèi)似于string.Format("ShowUser.aspx?UserId=0",“UserId”) 這樣構(gòu)建字符串。GridView控件的列還有“ReadOnly”屬性,設(shè)置該

39、列是否只讀;“Visible”屬性,設(shè)置該列的可見(jiàn)性,“SortExpress”屬性,設(shè)置該列的排序關(guān)鍵字。此外在上面的字段設(shè)置對(duì)話框中,還可以設(shè)置各字段顯示時(shí)的樣式,如利用HeadStyle、FootStyle、ItemStyle,ControlStyle等屬性,分別設(shè)置列的標(biāo)題樣式,頁(yè)腳樣式,行樣式和控件樣式等。2 GridView的模板GridView控件也支持模板,可以通過(guò)TemplateField來(lái)為GridView中每一列定義一個(gè)完全定制的模板??梢栽谀0逯屑尤際TML元素或者控件并綁定表達(dá)式,可以說(shuō),在模板中完全可以按照自己的方式布置一切。GridView支持5種不同類(lèi)型的模板,

40、含義與DataList中類(lèi)似,分別如下:l HeaderTemplate:頭模板,即表頭部分使用的模板,這部分一般不綁定數(shù)據(jù)。l FooterTemplate:腳模板,即腳注部分使用的模板。l ItemTemplate:項(xiàng)模板,普通行使用的模板,若定義了AlternatingItemTemplate,則這里的設(shè)置是奇數(shù)行使用的模板。l AlternatingItemTemplate:交替項(xiàng)模板,偶數(shù)行中使用的模板,如果沒(méi)有此模板則按照ItemTemplate中的設(shè)置顯示。l EditItemTemplate:編輯項(xiàng)模板,數(shù)據(jù)處于編輯狀態(tài)時(shí)使用的模板。最后利用TemplateField的Head

41、Style、FootStyle、ItemStyle,ControlStyle等屬性,分別設(shè)置列的標(biāo)題樣式,頁(yè)腳樣式,行樣式和控件樣式。3 GridView的分頁(yè)與排序GridView已經(jīng)把分頁(yè)組件PageDataSource內(nèi)置在其本身中了,所以實(shí)現(xiàn)分頁(yè)很簡(jiǎn)單。首先設(shè)置它允許分頁(yè)屬性allowPaging為T(mén)rue,然后設(shè)置分頁(yè)盡寸PageSize為多少。如果GridView的數(shù)據(jù)源是一個(gè)SqlDataSource數(shù)據(jù)源控件,只需要設(shè)置allowPaging為T(mén)rue,以及PageSize的值即可,不用編寫(xiě)分頁(yè)事件PageIndexChanging代碼。如果是編程方式為GridView設(shè)定數(shù)據(jù)

42、源,設(shè)定這兩個(gè)分頁(yè)屬性后,還要為分頁(yè)事件PageIndexChanging事件編寫(xiě)代碼,代碼內(nèi)容是設(shè)置當(dāng)前要顯示的頁(yè)索引并重新綁定數(shù)據(jù)即可。另一個(gè)與分頁(yè)有關(guān)的事件PageIndexChanged,是在分頁(yè)完成后觸發(fā)的。GridView涉及分頁(yè)的主要屬性有:l AllowPaging屬性:設(shè)置是否啟用分頁(yè)功能。 l PageCount屬性:獲取分頁(yè)后的總頁(yè)數(shù)。 l PageIndex屬性:獲取或設(shè)置當(dāng)前顯示頁(yè)的索引。 l PageSize屬性:設(shè)置GridView每頁(yè)顯示的記錄數(shù)。對(duì)于代碼方式為GridView設(shè)置數(shù)據(jù)源,設(shè)定GridView的布局后,要啟用排序,首先,設(shè)置其AllowSorti

43、ng為T(mén)rue,然后設(shè)置排序列的SortExpression屬性,它是數(shù)據(jù)源中的相應(yīng)字段名,預(yù)覽后,該列就以LinkButton的方式顯示。但現(xiàn)在還不能排序,因?yàn)闆](méi)有設(shè)置排序事件。在排序事件中,主要是設(shè)置排序關(guān)鍵字和排序方向,即相當(dāng)于SELECT命令的“order by 排序字段 ASC|DESC”中的后兩個(gè)參數(shù)。排序可以借助ADO.NET中的DataView對(duì)象完成。只要你通過(guò)DataView的“Sort”屬性指出了DataView的排序表達(dá)式和排序方向,它就可以自動(dòng)完成排序。涉及排序的屬性是:l AllowSorting 屬性:設(shè)置是否啟用排序功能。l SortExpress屬性:通過(guò)它設(shè)

44、置作為排序列的排序關(guān)鍵字,它是列的屬性,不是GridView的屬性。當(dāng)把某列的SortExpress屬性設(shè)好后,該列標(biāo)題就以鏈接按鈕LinkButton形式呈現(xiàn),如果某列的SortExpress屬性值為空,此列將沒(méi)有排序功能。除了上面的屬性外,還有一些常用的屬性,這里一并介紹如下:l AutoGenerateColumns 屬性:設(shè)置是否自動(dòng)創(chuàng)建綁定字段,默認(rèn)為true,實(shí)際開(kāi)發(fā)中很少自動(dòng)創(chuàng)建綁定列。l Columns屬性:GridView 控件中列字段的集合。l Rows屬性:GridView控件所有行記錄的集合。l DataKeyNames屬性:設(shè)置GridView控件的主鍵字段名數(shù)組,與

45、DataList控件一樣,設(shè)置過(guò)它以后,從DataKeys主鍵集合中就可以取出數(shù)據(jù)記錄行的主鍵值了。要注意,DataList的主鍵字段直接設(shè)置,如:“DataList1.DataKeyField = "UserId"”,但GridView必須把主鍵字段做成數(shù)組后賦給其DataKeyNames屬性,如:“string UserKey = "UserId" ; GridView1.DataKeyNames = UserKey;”。l DataKeys屬性:主鍵值集合,從中可以取出主鍵值,前提是要設(shè)置DataKeyNames屬性。l EditIndex屬性:當(dāng)

46、它的值為某數(shù)據(jù)行索引時(shí),該行進(jìn)入編輯狀態(tài),當(dāng)它的值為-1時(shí),退出編輯狀態(tài)。4 GridView的常用事件GridView支持多個(gè)事件,對(duì)GridView 進(jìn)行排序、選擇、創(chuàng)建行、綁定行、單擊按鈕等都會(huì)引發(fā)事件,GridView 控件常用的事件如下所示。我們注意到,很多事件以ed 和ing結(jié)尾,以ing結(jié)尾的事件通常在操作之前發(fā)生,以ed結(jié)尾的事件通常在操作之后發(fā)生,一般進(jìn)行更新、刪除記錄的操作,寫(xiě)在ing結(jié)尾的事件之中。l PageIndexChanging / PageIndexChanged:這兩個(gè)事件分別在改變當(dāng)前頁(yè)索引之前/之后發(fā)生,在分頁(yè)中使用它們。l SelectedIndexCh

47、anging / SelectedIndexChanged:這兩個(gè)事件分別在單擊某行的選擇按鈕(其CommandName 屬性值為“Select”的按鈕)之前/之后發(fā)生,在選擇功能中使用。l Sorting / Sorted:這兩個(gè)事件分別在單擊列的標(biāo)題行排序列的超鏈接后,在進(jìn)行排序操作之前/之后發(fā)生,在排序功能中使用。l RowCreated:在GridView控件中創(chuàng)建每個(gè)新行時(shí)發(fā)生,此事件通常用于在創(chuàng)建某個(gè)行時(shí)修改該行的布局或外觀。 l RowDataBound:它是在GridView綁定每一行數(shù)據(jù)時(shí)觸發(fā),所以數(shù)據(jù)源有多少條記錄,它就可能觸發(fā)多少次。l RowCommand:在 Grid

48、View中單擊按鈕時(shí)就會(huì)發(fā)生,所以其中包含的多個(gè)按鈕都會(huì)觸發(fā)此事件,在這個(gè)事件中會(huì)通過(guò)按鈕的CommandName屬性確定單擊的是哪個(gè)按鈕。l RowDeleting / RowDeleted:?jiǎn)螕裟承械膭h除按鈕(其CommandName屬性值為“Delete”的按鈕)時(shí),在從數(shù)據(jù)源刪除記錄之前/之后發(fā)生,在刪除功能中使用。l RowEditing:在單擊某行的編輯按鈕(其CommandName屬性值為“Edit”的按鈕)時(shí)發(fā)生,使行進(jìn)入編輯模式。l RowCancelingEdit:在單擊某行的取消按鈕(其CommandName屬性值為“Cancel”的按鈕)時(shí)發(fā)生,使行退出編輯模式。l R

49、owUpdating / RowUpdated:?jiǎn)螕裟承械母掳粹o(其 CommandName 屬性值為“Update”的按鈕)后,在更新數(shù)據(jù)源記錄之前/之后發(fā)生,在更新功能中使用。 上述這七個(gè)以Row開(kāi)頭的事件,與DataList的ItemCommand、EditCommand、CancelCommand、DeleteCommand、UpdateCommand事件的發(fā)生機(jī)制和功能類(lèi)似,都會(huì)借助于按鈕的CommandName和CommandArguement兩個(gè)屬性。【例】:從ShopUser數(shù)據(jù)表中讀取顧客信息到數(shù)據(jù)集,然后在GridView控件中顯示,顯示效果如圖所示,其中姓名是超鏈接,可

50、以跳到用戶詳情頁(yè),電子郵件也是超鏈接,單擊它自動(dòng)利用Outlook發(fā)送郵件。當(dāng)鼠標(biāo)在行間移動(dòng)時(shí),出現(xiàn)光棒效應(yīng),單擊“編號(hào)、姓名、性別、出生日期”四個(gè)字段的標(biāo)題,可以按相應(yīng)字段排序。啟用了分頁(yè)功能,每頁(yè)顯示6行,單擊“編輯”可跳到ModifyShopUserById.aspx網(wǎng)頁(yè),單獨(dú)對(duì)當(dāng)前記錄進(jìn)行全面編輯。GridView控件應(yīng)用之一(1)向網(wǎng)頁(yè)中添加GridView控件,在后臺(tái)為它綁定數(shù)據(jù)源,選中它進(jìn)行屬性設(shè)置。利用HeadStyle和RowStyle中的Height,設(shè)置行高是30px,并自動(dòng)套用格式為“簡(jiǎn)明型”。由于要按照編號(hào)、姓名、性別、出生日期等進(jìn)行排序,所以設(shè)置GridView的A

51、llowSorting屬性值為“True”。由于要分頁(yè),每頁(yè)6行數(shù)據(jù),所以設(shè)置AllowPaging為T(mén)rue及PageSize為6,根據(jù)需要,利用PageStyle的子屬性調(diào)整頁(yè)樣式,設(shè)置頁(yè)樣式行的背景色,前景色和對(duì)齊方式等。最后設(shè)置GridView的GridLine為“both”,使單元格的垂直水平方向都有網(wǎng)格線。單擊右上方“編輯列”快捷菜單,利用BoundField,添加編號(hào),用戶名,出生日期和民族4個(gè)列,設(shè)置它們的HeaderText、DataField、SortExpression屬性值,沒(méi)有設(shè)置SortExpression屬性的列不啟用排序。利用ItemStyle設(shè)定它們的水平對(duì)齊

52、方式HorizontalAlign和寬度Width,編輯列的設(shè)計(jì)界面如圖。編輯列設(shè)計(jì)界面利用HyperLinkField,添加姓名、電子郵件、常瀏覽網(wǎng)址和編輯3個(gè)列,設(shè)置它們的HeaderText、DataTextField、DataNavigateUrlField、DataNavigateUrlFormat、Target及ItemStyle屬性下的寬度和水平對(duì)齊等屬性,這樣設(shè)計(jì)好后運(yùn)行,發(fā)現(xiàn)姓名、常瀏覽網(wǎng)址和編輯的超鏈接正常,但電子郵件不是超鏈接,不能利用Outlook發(fā)送郵件,為此把電子郵件列轉(zhuǎn)換為模板列,進(jìn)行自定義處理,實(shí)現(xiàn)了超鏈接效果,設(shè)計(jì)界面如圖。超鏈接列轉(zhuǎn)為模板列后列屬性設(shè)計(jì)界面由

53、于性別在數(shù)據(jù)表中是布爾型,現(xiàn)在要顯示為“男”、“女”,所以利用模板列來(lái)設(shè)計(jì),先添加一個(gè)模板列TemplateField,然后設(shè)計(jì)它的HeaderText、SortExpression及ItemStyle下的寬度和水平對(duì)齊等屬性,最后進(jìn)入“編輯模板”,在性別列的ItemTemplate項(xiàng)模板中,添加一個(gè)標(biāo)簽,設(shè)計(jì)它的Text屬性值為:“Eval("Sex").ToString()="True"?"男":"女"”即可。年齡列的設(shè)計(jì):由于在數(shù)據(jù)表中沒(méi)有年齡字段,只能借助出生日期構(gòu)造年齡列,所以使用模板列。先添加一個(gè)模板列

54、,設(shè)計(jì)好它的標(biāo)題HeaderText及列寬,然后進(jìn)入年齡列模板的項(xiàng)模板ItemTemplate中,加入一個(gè)標(biāo)簽,然后把標(biāo)簽的Text屬性綁定到表達(dá)式“GetAge(Eval("Birthday")”,并在后臺(tái)定義“GetAge(object obj)”。(1)事件的編寫(xiě)網(wǎng)頁(yè)加載事件,實(shí)現(xiàn)對(duì)DataList的數(shù)據(jù)綁定protected void Page_Load(object sender, EventArgs e) if (!IsPostBack) DataBindToGridView(); 被反復(fù)調(diào)用的代碼private void DataBindToGridView(

55、) string UserKey = "UserId" ;/GridView主鍵必須是數(shù)組 this.GridView1.DataSource = oShopUserDAL.GetDataView(); this.GridView1.DataKeyNames=UserKey; /設(shè)置GridView主鍵名,便于從主鍵集取主鍵 this.GridView1.DataBind();GridView的RowDataBound事件,用于設(shè)定光棒效應(yīng)。protected void GridView1_RowDataBound(object sender, GridViewRowEve

56、ntArgs e) if (e.Row.RowType = DataControlRowType.DataRow)/ 判斷當(dāng)前是否是數(shù)據(jù)行 e.Row.Attributes.Add("onmouseover", "c=this.style.backgroundColor;this.style. backgroundColor = 'LightBlue'"); e.Row.Attributes.Add("onmouseout", "this.style.backgroundColor=c;"); RowType是玫舉類(lèi)型DataControlRowType中的一個(gè)值。RowType可以取的值包括 DataRow、Footer、Header、EmptyDataRow、Pager、Separator等,通過(guò)RowTy

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論