版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第六學(xué)習(xí)情境:商品采購(gòu)管理系統(tǒng)6.1學(xué)習(xí)情境引入6.2基礎(chǔ)知識(shí)1:網(wǎng)上書(shū)店系統(tǒng)的數(shù)據(jù)庫(kù)(選學(xué))6.3基礎(chǔ)知識(shí)1:數(shù)據(jù)源控件與靜態(tài)查詢6.4基礎(chǔ)知識(shí)2:常用數(shù)據(jù)綁定控件及基本數(shù)據(jù)操作6.5基礎(chǔ)知識(shí)3:編程實(shí)現(xiàn)復(fù)雜的動(dòng)態(tài)查詢
6.6決策與計(jì)劃
6.7實(shí)施
6.8檢查與評(píng)價(jià)6.1學(xué)習(xí)情境引入
6.1.1網(wǎng)上書(shū)店后臺(tái)管理的功能需求6.1.2網(wǎng)上書(shū)店后臺(tái)管理的展示(參見(jiàn)第一章)6.1.3網(wǎng)上書(shū)店后臺(tái)管理技術(shù)分解6.1.1網(wǎng)上書(shū)店后臺(tái)管理的功能需求
網(wǎng)上書(shū)店的后臺(tái)管理需要多種管理功能。訂單管理:訂單查詢、處理功能。入庫(kù)管理:新書(shū)入庫(kù)、入庫(kù)記錄查詢功能。圖書(shū)管理:圖書(shū)信息修改、類別管理功能。會(huì)員管理功能。6.1.3網(wǎng)上書(shū)店后臺(tái)管理技術(shù)技能分解
1.技術(shù)分解開(kāi)發(fā)一個(gè)完整的系統(tǒng)需要很多技術(shù),如商品采購(gòu)管理系統(tǒng)主要應(yīng)用了以下多種技術(shù)。(1)數(shù)據(jù)獲取技術(shù)(2)數(shù)據(jù)綁定控件6.1.3商品采購(gòu)管理系統(tǒng)開(kāi)發(fā)技能分解
2.學(xué)習(xí)安排本書(shū)按照資訊、學(xué)習(xí)情境引入、基礎(chǔ)知識(shí)講解、實(shí)施、小結(jié)等幾個(gè)階段來(lái)創(chuàng)建一個(gè)學(xué)習(xí)情境,讀者要把自己置身于這個(gè)情境之中,既是學(xué)習(xí)者,又是項(xiàng)目實(shí)施者。6.2基礎(chǔ)知識(shí):項(xiàng)目的開(kāi)發(fā)環(huán)境
6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作6.2.2業(yè)務(wù)數(shù)據(jù)表6.2.3數(shù)據(jù)表間關(guān)系
6.2.4存儲(chǔ)過(guò)程和觸發(fā)器6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作
1.新建數(shù)據(jù)庫(kù)在“解決方案管理器”中,用鼠標(biāo)右鍵單擊網(wǎng)站名,選擇“添加新項(xiàng)”選項(xiàng),在出現(xiàn)的對(duì)話框中選擇“SQLServer數(shù)據(jù)庫(kù)”,輸入數(shù)據(jù)庫(kù)文件名“bookStore.mdf”,單擊“添加”按鈕,系統(tǒng)出現(xiàn)如圖6-2所示的警示對(duì)話框,選擇“是”,這樣就會(huì)建立一個(gè)空數(shù)據(jù)庫(kù),而且在“服務(wù)器資源管理器”中將自動(dòng)建立與該數(shù)據(jù)庫(kù)的連接,另外,ASP.NET的保護(hù)機(jī)制不允許客戶端下載“App_Data”文件夾中的文件,從而可以使數(shù)據(jù)受到保護(hù)。在“服務(wù)器資源管理器”中,也可以創(chuàng)建SQLServer數(shù)據(jù)庫(kù)。但要注意的是,數(shù)據(jù)庫(kù)文件默認(rèn)存放位置,是所選SQLServer服務(wù)器的數(shù)據(jù)文件夾,比如,SQLServer2005Express服務(wù)器的默認(rèn)數(shù)據(jù)庫(kù)文件位置為:“C:\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\Data”,此文件夾中的數(shù)據(jù)庫(kù)文件,在發(fā)布網(wǎng)站時(shí),需要再將其復(fù)制到“App_Data”文件夾中,并修改網(wǎng)站的連接字符串。6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作
6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作
2添加數(shù)據(jù)庫(kù)對(duì)象在“App_Data”文件夾中創(chuàng)建新數(shù)據(jù)庫(kù)后,在“服務(wù)器資源管理器”中,展開(kāi)新數(shù)據(jù)庫(kù)bookStore.MDF節(jié)點(diǎn),將自動(dòng)連接該數(shù)據(jù)庫(kù),并可定義各種數(shù)據(jù)庫(kù)對(duì)象(1)添加表右擊“表”節(jié)點(diǎn),選擇“添加新表”,會(huì)出現(xiàn)表結(jié)構(gòu)文檔選項(xiàng)卡,就可以定義表結(jié)構(gòu),保存時(shí),會(huì)提示輸入表名。6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作
(2)添加數(shù)據(jù)庫(kù)關(guān)系圖右擊“數(shù)據(jù)庫(kù)關(guān)系圖”節(jié)點(diǎn),選擇“添加新關(guān)系圖”,即可選擇已有表,在表視圖間拖動(dòng)鼠標(biāo),即可在表間建立外鍵關(guān)系,如圖6?4,按住OrderDetails表BookID列左側(cè)拖動(dòng)到Books上,將出現(xiàn)兩個(gè)對(duì)話框,供選擇表和列,以及修改外鍵關(guān)系的屬性,默認(rèn)情況下,單擊“確定”即可。按住此處拖動(dòng)圖6?4可視化添加新關(guān)系圖按住此處拖動(dòng)6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作
(3)添加存儲(chǔ)過(guò)程右擊“存儲(chǔ)過(guò)程”節(jié)點(diǎn),選擇“添加新存儲(chǔ)過(guò)程”,會(huì)出現(xiàn)可供編輯的存儲(chǔ)過(guò)程文檔選項(xiàng)卡,并已有“CreateProcedure”語(yǔ)句,編輯完成后,單擊工具欄的保存按鈕,即可運(yùn)行此創(chuàng)建存儲(chǔ)過(guò)程的語(yǔ)句。6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作
(4)添加觸發(fā)器在已經(jīng)添加完成Orders表的情況下,展開(kāi)“表”節(jié)點(diǎn),右擊“Orders”,選擇“添加新觸發(fā)器”,會(huì)出現(xiàn)可供編輯的觸發(fā)器文檔選項(xiàng)卡,并已有“CreateTrigger”語(yǔ)句,編輯和保存方法與存儲(chǔ)過(guò)程6.2.1創(chuàng)建數(shù)據(jù)庫(kù)的操作
6.2.2業(yè)務(wù)數(shù)據(jù)表
網(wǎng)上書(shū)店數(shù)據(jù)庫(kù)包含自動(dòng)生成的ASP.NET角色和成員資格數(shù)據(jù)部分,以及業(yè)務(wù)數(shù)據(jù)部分,本章僅涉及根據(jù)需求建立的業(yè)務(wù)數(shù)據(jù)部分。6.2.2業(yè)務(wù)數(shù)據(jù)表
1、圖書(shū)類別表用于保存圖書(shū)類別信息,命名為Categorys。類別信息本身是樹(shù)形結(jié)構(gòu)的,通過(guò)每個(gè)類別的“父類別ID”來(lái)轉(zhuǎn)化為關(guān)系結(jié)構(gòu)。該表設(shè)計(jì)結(jié)構(gòu)如圖6?5所示。6.2.2業(yè)務(wù)數(shù)據(jù)表
2、圖書(shū)信息表用于保存圖書(shū)信息,在進(jìn)貨、銷售、庫(kù)存鏈條中,用作庫(kù)存表,命名為Books,其結(jié)構(gòu)如圖6?6。3、入庫(kù)表用于記錄進(jìn)貨信息,如圖6?7所示。6.2.2業(yè)務(wù)數(shù)據(jù)表
6.2.2業(yè)務(wù)數(shù)據(jù)表4、用戶表保存了用戶(會(huì)員)信息,會(huì)員賬戶的其他信息保存在自動(dòng)生成的ASP.NET角色和成員資格數(shù)據(jù)表中,故此表命名為User2,其結(jié)構(gòu)如圖6?8。關(guān)于ASP.NET角色和成員資格,參見(jiàn)后續(xù)章節(jié)的介紹。6.2.2業(yè)務(wù)數(shù)據(jù)表
5、送貨方式表為規(guī)范管理送貨方式信息,防止用戶輸入混亂,專門(mén)建立了送貨方式表,命名為SendModes,如圖6?9。6.2.2業(yè)務(wù)數(shù)據(jù)表
6、付款方式表與送貨方式類似,建立了付款方式表,命名為PayModes,圖6?10示出了該表結(jié)構(gòu)。6.2.2業(yè)務(wù)數(shù)據(jù)表
7、訂單表用戶的訂單信息,保存在Orders表中,其結(jié)構(gòu)如圖6?11所示。訂單表中并不保存訂購(gòu)的圖書(shū)信息。6.2.2業(yè)務(wù)數(shù)據(jù)表
8、訂單詳細(xì)表每個(gè)訂單中訂購(gòu)的圖書(shū)詳細(xì)信息,保存在表OrderDetails中,其結(jié)構(gòu)如圖6?126.2.3數(shù)據(jù)表間關(guān)系
為避免誤操作,根據(jù)業(yè)務(wù)需求,建立如圖6?13所示的外鍵關(guān)系。6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
1、存儲(chǔ)過(guò)程(1)新書(shū)入庫(kù)存儲(chǔ)過(guò)程該存儲(chǔ)過(guò)程接收某種將入庫(kù)新書(shū)的所有信息作為輸入?yún)?shù),將其無(wú)條件插入到入庫(kù)表Input中,并查詢Books表中是否已經(jīng)存在該種圖書(shū),若已經(jīng)存在,除了庫(kù)存數(shù)量一定要更新,還分別根據(jù)是否提供了圖片文件、圖書(shū)摘要、圖書(shū)目錄三個(gè)參數(shù),決定是否更新圖片文件、圖書(shū)摘要、圖書(shū)目錄信息;若不存在,則將新書(shū)信息插入Books表。6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
根據(jù)此流程,編寫(xiě)新書(shū)入庫(kù)存儲(chǔ)過(guò)程BookInput的T-SQL代碼如下:
CREATEPROCEDURE[dbo].[BookInput]
@BookNamenvarchar(50),@BookPricedecimal(18,2),@InputPricedecimal(18,2),
@BookPublishernvarchar(50),@BookISBNnvarchar(20),
@BookPublishDatedatetime,@BookAuthornvarchar(50),@BookQuantityint,
@CategoryIDint,@BookImagenvarchar(256),@BookPageCountint,
@BookAddTimedatetime,@BookAbstractnvarchar(4000),
@BookContentsnvarchar(4000)
as
begin
declare@bookIdint,@cmdStrnvarchar(1024)
begintransaction
6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
--如果在Books表中已經(jīng)存在,只更新數(shù)量,另判斷圖片文件、摘要、目錄是否需要更新
select@bookId=BookIDfromBookswhereBookName=@BookName
andBookPrice=@BookPriceandBookPublisher=@BookPublisher
andBookISBN=@BookISBNandBookPublishDate=@BookPublishDate
andBookAuthor=@BookAuthorandCategoryID=@CategoryID
andBookPageCount=@BookPageCount
if(@bookIdisnotnull)
begin
set@cmdStr='updateBookssetBookQuantity=BookQuantity+'6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
+Convert(varchar,@BookQuantity) --若提供了@BookAbstract參數(shù),則以此為準(zhǔn)更新對(duì)應(yīng)字段 --若此參數(shù)為null,則不更新,@BookContents和@BookImage類似。 if(@BookAbstractisnotnull) set@cmdStr=@cmdStr+',BookAbstract='+@BookAbstract if(@BookContentsisnotnull) set@cmdStr=@cmdStr+',BookContents='+@BookContents if(@BookImageisnotnull) set@cmdStr=@cmdStr+',BookImage=@BookImage' set@cmdStr=@cmdStr+'whereBookID='+Convert(varchar,@bookId) exec(@cmdStr)6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
end else begin insertintoBooksvalues (@BookName,@BookPrice,10.0,@BookPublisher,@BookISBN, @BookPublishDate,@BookAuthor,@BookQuantity,@CategoryID, @BookImage,@BookPageCount,@BookAddTime,@BookAbstract, @BookContents) set@bookId=scope_identity() end insertintoInput values(@bookId,@InputPrice,@BookQuantity,@BookAddTime) committransactionendGO6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
代碼中“--”是T-SQL語(yǔ)言的注釋符號(hào)。T-SQL中自定義變量均須以“@”符號(hào)開(kāi)頭。“Convert(varchar,@BookQuantity)”是T-SQL的轉(zhuǎn)換函數(shù),將@BookQuantity變量轉(zhuǎn)換為varchar類型?!癳xec(@cmdStr)”用于將@cmdStr字符串解釋為T(mén)-SQL命令,并執(zhí)行?!皊cope_identity()”將返回上一個(gè)Insert語(yǔ)句所影響的標(biāo)識(shí)列值,此處即Books表中新增圖書(shū)的BookID值。6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
(2)新建訂單存儲(chǔ)過(guò)程由于訂單表Orders的主鍵列OrderID是一個(gè)自動(dòng)增量的標(biāo)識(shí)列,所以,新建訂單操作分為兩個(gè)步驟:①在Orders表中插入新記錄,得到新增記錄的OrderID;②使用上述OrderID,在訂單明細(xì)表OrderDetails表中插入該訂單所屬的若干購(gòu)書(shū)信息記錄。由于購(gòu)書(shū)信息來(lái)自前臺(tái)購(gòu)物車(chē),并且使用前臺(tái)C#語(yǔ)言的循環(huán)語(yǔ)句能夠簡(jiǎn)化編程,所以,存儲(chǔ)過(guò)程中僅包括第①步的功能,T-SQL代碼如下所示:CREATEproc[dbo].[NewOrder]@UserNamenvarchar(256),@Recipientnvarchar(20),@Addressnvarchar(256),6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
@Postalcodechar(6),@Phonevarchar(50),@SendModeIDint,@PayModeIDint,@OrderTimedatetime,@TreatRemarknvarchar(256),@Outputedbit,@TreatCompletedbitasbegin insertintoOrders values(@UserName,@Recipient,@Address,@Postalcode,@Phone,@SendModeID,@PayModeID,@OrderTime,@TreatRemark,@Outputed, @TreatCompleted) --返回新建訂單的ID,供插入訂單明細(xì)表使用 selectscope_identity()end GO6.2.4存儲(chǔ)過(guò)程和觸發(fā)器
6.2.4存儲(chǔ)過(guò)程和觸發(fā)器2、觸發(fā)器
對(duì)于出庫(kù)操作,用訂單表Orders的Update觸發(fā)器,實(shí)現(xiàn)Books表中的庫(kù)存數(shù)量按訂單明細(xì)減少功能。當(dāng)然,有興趣的讀者也可以嘗試改為存儲(chǔ)過(guò)程。管理員在訂單處理時(shí)的任何修改,以及會(huì)員對(duì)個(gè)人訂單的任何修改,都會(huì)運(yùn)行該觸發(fā)器,因此需要判斷是否正在進(jìn)行出庫(kù)操作:管理員設(shè)置某訂單(由OrderID確定該訂單)的“是否已出庫(kù)”O(jiān)utputed字段,將其由false變?yōu)閠rue,bit值為從0變1,即為出庫(kù)操作。此時(shí)需要在OrderDetails表中查找此OrderID的所有圖書(shū)(由BookID確定某圖書(shū))的購(gòu)書(shū)數(shù)量,在Books表中將對(duì)應(yīng)BookID圖書(shū)的庫(kù)存數(shù)量做相應(yīng)減少。6.3數(shù)據(jù)源控件與靜態(tài)查詢
6.3.1數(shù)據(jù)源控件的種類6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢ASP.NET的數(shù)據(jù)源控件現(xiàn)有7種類型,分別用于訪問(wèn)不同的數(shù)據(jù)來(lái)源:SqlDataSourceObjectDataSourceXmlDataSourceSiteMapDataSourceLinqDataSourceEntityDataSource6.3.1數(shù)據(jù)源控件的種類6.3.1數(shù)據(jù)源控件的種類
1、SqlDataSource用于訪問(wèn)支持SQL標(biāo)準(zhǔn)的數(shù)據(jù)庫(kù),比如MSSQLServer系列,實(shí)際上可以訪問(wèn)ADO.NET支持的所有數(shù)據(jù)源,連接種類包含SqlConnection、OleDbConnection、OracleConnection、OdbcConnection。由于數(shù)據(jù)庫(kù)的普及應(yīng)用,SqlDataSource數(shù)據(jù)源是ASP.NET中使用最普遍的數(shù)據(jù)源控件。6.3.1數(shù)據(jù)源控件的種類
2、AccessDataSource用于訪問(wèn)無(wú)用戶名密碼的Access數(shù)據(jù)庫(kù)文件,不需提供連接字符串。如果Access數(shù)據(jù)庫(kù)文件需要密碼訪問(wèn),還是必須使用SqlDataSource。Access是微軟提供的桌面數(shù)據(jù)庫(kù)管理系統(tǒng),功能有限。其使用方法和SqlDataSource類似,6.3.1數(shù)據(jù)源控件的種類
3、ObjectDataSource用于訪問(wèn)對(duì)象數(shù)據(jù)源。對(duì)象及其來(lái)源是非常廣泛的:數(shù)據(jù)表可以對(duì)象化為DataTable或數(shù)組等對(duì)象,某個(gè)文件夾下的所有文件名及其屬性可以對(duì)象化為DataTable或數(shù)組等對(duì)象,我們可以根據(jù)業(yè)務(wù)邏輯將任意元素都定義為對(duì)象。這樣,ObjectDataSource就為我們提供了自由廣泛的業(yè)務(wù)邏輯空間,而同時(shí)擺脫了綁定、排序、分頁(yè)等一般性的繁瑣處理。6.3.1數(shù)據(jù)源控件的種類4、XmlDataSource用于訪問(wèn)XML文件,XML(擴(kuò)展標(biāo)記語(yǔ)言)已經(jīng)成為重要的跨平臺(tái)信息表達(dá)、傳輸標(biāo)準(zhǔn)。XML文檔最適合表達(dá)可以描述為層次結(jié)構(gòu)的信息,所以,XmlDataSource一般綁定到TreeView、Menu等層次型(樹(shù)型)的控件。6.3.1數(shù)據(jù)源控件的種類
5、SiteMapDataSource用于訪問(wèn)網(wǎng)站根目錄的Web.sitemap文件,綁定到TreeView、Menu等導(dǎo)航控件,而為網(wǎng)站提供站點(diǎn)地圖功能。SiteMapDataSource是XmlDataSource的一個(gè)特例,只綁定到特定的Web.sitemap文件,該文件是一個(gè)標(biāo)準(zhǔn)的XML文檔,包含了網(wǎng)站中的各級(jí)頁(yè)面標(biāo)題、頁(yè)面地址等層次信息。6.3.1數(shù)據(jù)源控件的種類
6、LinqDataSource使用LinqDataSource訪問(wèn)數(shù)據(jù)庫(kù)時(shí),需要先建立LINQ對(duì)象,然后將其指定給LinqDataSource的屬性。在網(wǎng)站中“添加新項(xiàng)”,添加“LINQtoSQL類”,并進(jìn)一步建立LINQ對(duì)象與數(shù)據(jù)庫(kù)表、存儲(chǔ)過(guò)程之間的“1:1”映射,數(shù)據(jù)表映射為類,存儲(chǔ)過(guò)程映射為方法,觸發(fā)器因不會(huì)被前臺(tái)調(diào)用而不會(huì)被映射。6.3.1數(shù)據(jù)源控件的種類
7、EntityDataSource使用EntityDataSource訪問(wèn)數(shù)據(jù)庫(kù)時(shí),需要先建立實(shí)體數(shù)據(jù)模型(EDM),即實(shí)體對(duì)象,然后將其指定給EntityDataSource的屬性。在網(wǎng)站中“添加新項(xiàng)”,添加“ADO.NETEntityDataModel”,并按照向?qū)崾咀鲞M(jìn)一步的操作,即可生成相關(guān)的實(shí)體對(duì)象。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
SqlDataSource控件不但封裝了ADO.NET無(wú)連接訪問(wèn)數(shù)據(jù)庫(kù)的功能,還包含了綁定、排序、分頁(yè)的功能。由于ASP.NET的數(shù)據(jù)源控件與頁(yè)面數(shù)據(jù)綁定控件結(jié)合非常緊密,共同實(shí)現(xiàn)數(shù)據(jù)操作功能,本節(jié)將以GridView數(shù)據(jù)綁定控件為例來(lái)說(shuō)明SqlDataSource數(shù)據(jù)源的使用6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
1、配置SqlDataSource實(shí)現(xiàn)無(wú)條件查詢例6?1配置SqlDataSource顯示Input表的全部記錄。新建一個(gè)Web窗體頁(yè),命名為InputQuery.aspx,在設(shè)計(jì)器代碼視圖輸入其title為“入庫(kù)單查詢”(或在屬性面板修改Title屬性)。從工具箱“數(shù)據(jù)”選項(xiàng)卡中,拖一個(gè)GridView控件到頁(yè)面上6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
單擊GridView任務(wù)按鈕,在“選擇數(shù)據(jù)源”下拉框中選擇“<新建數(shù)據(jù)源…>”,出現(xiàn)“數(shù)據(jù)源配置向?qū)А睂?duì)話框。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
單擊“數(shù)據(jù)庫(kù)”圖標(biāo),系統(tǒng)將自動(dòng)生成SqlDataSource類型的數(shù)據(jù)源,修改數(shù)據(jù)源ID為“SqlDataSourceInput”,如圖6?16,單擊“確定”按鈕,出現(xiàn)“配置數(shù)據(jù)源-SqlDataSourceInput”對(duì)話框,如圖6?17所示。在圖中下拉列表里已經(jīng)包含了“服務(wù)器資源管理器”中已經(jīng)建立的所有連接和“App_Data”文件夾下的數(shù)據(jù)庫(kù)文件的連接,一般情況下,選擇一個(gè)即可。單擊“新建連接”按鈕,則可在“添加連接”對(duì)話框中,進(jìn)一步輸入服務(wù)器名和數(shù)據(jù)庫(kù)名,創(chuàng)建或附加一個(gè)數(shù)據(jù)庫(kù)。在已經(jīng)按照6.2.1創(chuàng)建數(shù)據(jù)庫(kù)之后,我們?cè)趫D6?17中選擇下拉列表中的“bookStore.mdf”即可,單擊“下一步”按鈕,如果是本網(wǎng)站首次使用此數(shù)據(jù)庫(kù),向?qū)⒊霈F(xiàn)圖6?18所示的提示。建議要保存此連接到配置文件中,配置文件即網(wǎng)站根目錄下的web.config文件。如果不保存,整個(gè)網(wǎng)站中,每個(gè)訪問(wèn)此數(shù)據(jù)庫(kù)的控件都將獨(dú)立保存一個(gè)連接字符串,假如數(shù)據(jù)庫(kù)文件的路徑變了,修改起來(lái)比較麻煩。單擊“下一步”,進(jìn)入向?qū)У摹芭渲肧elect語(yǔ)句”環(huán)節(jié),如圖6?19
如果選擇“指定自定義SQL語(yǔ)句或存儲(chǔ)過(guò)程”單選鈕,則進(jìn)入“定義自定義語(yǔ)句或存儲(chǔ)過(guò)程”對(duì)話框可以輸入SQL語(yǔ)句(或使用查詢生成器)或者指定已經(jīng)存在的存儲(chǔ)過(guò)程。網(wǎng)上書(shū)店管理系統(tǒng)Default.aspx頁(yè)面中的“SqlDataSourceChangXiaoPaiHang”數(shù)據(jù)源控件,就使用了自定義查詢語(yǔ)句;Managers/BookInput.aspx頁(yè)面中的SqlDataSourceBooks數(shù)據(jù)源控件則使用了存儲(chǔ)過(guò)程。如果選擇“指定來(lái)自表或視圖的列”,可以在下拉列表中選擇某個(gè)表或視圖,然后選擇列,并自動(dòng)生成對(duì)應(yīng)的Select語(yǔ)句?!爸环祷匚ㄒ恍小睂镾elect語(yǔ)句添加Distinct關(guān)鍵詞;單擊“WHERE(W)…”按鈕、“ORDERBY(R)…”按鈕將分別出現(xiàn)為Select語(yǔ)句添加Where子句和OrderBy子句的對(duì)話框;單擊“高級(jí)(V)…”按鈕則可以選擇是否根據(jù)Select語(yǔ)句自動(dòng)生成Insert、Delete、Update修改語(yǔ)句,以及修改時(shí)是否使用“開(kāi)放式并發(fā)”,選擇“開(kāi)放式并發(fā)”,將會(huì)為Delete、Update語(yǔ)句的Where子句增添包含全部字段的舊值比較邏輯。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
在本例中,我們選擇“指定來(lái)自表或視圖的列”,選擇“Input”表,選擇“*”,即所有列,單擊“下一步”按鈕,進(jìn)入測(cè)試查詢階段,如圖6?20。如果使用了自定義Select語(yǔ)句,為了分析Select語(yǔ)句是否正確,可以單擊“測(cè)試查詢”按鈕進(jìn)行測(cè)試,本例中我們單擊“完成”按鈕即可。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
現(xiàn)在,注意觀察使用向?qū)瓿蓴?shù)據(jù)源控件配置后,InputQuery.aspx頁(yè)面標(biāo)記代碼中,增加了SqlDataSourceInput標(biāo)記,并已經(jīng)給ConnectionString和SelectCommand屬性賦值,代碼如下:<asp:SqlDataSourceID="SqlDataSourceInput"runat="server"ConnectionString="<%$ConnectionStrings:bookStoreConnectionString%>"SelectCommand="SELECT*FROM[Input]"></asp:SqlDataSource>其中“<%$ConnectionStrings:bookStoreConnection%>”,是一個(gè)ASP.NET表達(dá)式,ASP.NET表達(dá)式在aspx標(biāo)記代碼中以“<%$”開(kāi)頭,最常見(jiàn)的用途就是在數(shù)據(jù)源控件中引用配置文件的連接字符串,運(yùn)行時(shí),將由配置文件中的連接字符串代替此處表示引用配置文件中“ConnectionStrings”節(jié)的name屬性為“bookStoreConnectionString”的連接字符串,此時(shí),我們可以對(duì)照觀察圖6?18中保存連接字符串后,web.config文件中添加了以下配置代碼:6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
<connectionStrings><addname="bookStoreConnectionString"connectionString="DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\bookStore.MDF;IntegratedSecurity=True;UserInstance=True"providerName="System.Data.SqlClient"/></connectionStrings>
最后,右擊頁(yè)面InputQuery.aspx,選擇“在瀏覽器中查看”,則可看到如圖6?21的運(yùn)行結(jié)果,無(wú)需編寫(xiě)任何代碼,就已經(jīng)能夠顯示入庫(kù)表中數(shù)據(jù)。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢2、配置SqlDataSource實(shí)現(xiàn)單條件查詢例6?1是把Input表中的所有記錄都顯示在了頁(yè)面中,而實(shí)際應(yīng)用中一般都是按照用戶輸入的條件來(lái)查詢,這當(dāng)然需要有條件值的來(lái)源,比如頁(yè)面上的一個(gè)文本框,用戶在文本框的輸入將用作查詢參數(shù),即SqlDataSource的SelectParameters屬性。在“列”下列列表中列出了Input表的所有字段,選擇“BookID”;“運(yùn)算符”選擇“=”;“源”下拉列表中列出了查詢參數(shù)的可能來(lái)源,簡(jiǎn)單介紹如下:None:參數(shù)不是根據(jù)某個(gè)來(lái)源動(dòng)態(tài)設(shè)置的,必須在“參數(shù)屬性”部分輸入常量值。Control:參數(shù)來(lái)自于頁(yè)面控件,必須在“參數(shù)屬性”部分選擇當(dāng)前頁(yè)面已有的控件ID,也可輸入默認(rèn)值,以免發(fā)生異常,默認(rèn)值是在用戶還沒(méi)有在控件中輸入值時(shí)的查詢參數(shù)。Cookie:參數(shù)來(lái)源于客戶端請(qǐng)求中所包含的一個(gè)Cookie。Form:參數(shù)來(lái)源于Form字段。Profile:參數(shù)來(lái)源于用戶的配置文件。用戶配置文件默認(rèn)存儲(chǔ)于ASP.NET角色和成員資格數(shù)據(jù)庫(kù)中,類似于存儲(chǔ)于數(shù)據(jù)庫(kù)的Session,但其屬性對(duì)象是強(qiáng)類型的。QueryString:參數(shù)來(lái)源于客戶端請(qǐng)求URL中包含的一個(gè)查詢字符串。Session:參數(shù)來(lái)源于Session變量。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
現(xiàn)在,注意觀察完成where子句配置后,InputQuery.aspx頁(yè)面代碼中SqlDataSourceInput的標(biāo)記代碼如下:<asp:SqlDataSourceID="SqlDataSourceInput"runat="server"ConnectionString="<%$ConnectionStrings:bookStoreConnectionString%>"SelectCommand="SELECT*FROM[Input]WHERE([BookID]=@BookID)"><SelectParameters><asp:ControlParameterControlID="TextBoxBookID"Name="BookID"PropertyName="Text"Type="Int32"/></SelectParameters></asp:SqlDataSource>6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢
6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢3、配置SqlDataSource實(shí)現(xiàn)多條件查詢有時(shí)我們需要多條件查詢,條件中的運(yùn)算符也不一定是“等于”,比如:查詢進(jìn)貨數(shù)量“超過(guò)”1000或者進(jìn)價(jià)“高于”10元的入庫(kù)記錄。這樣的查詢實(shí)際上是在查詢語(yǔ)句的where子句中包含多個(gè)條件。實(shí)現(xiàn)多條件查詢,也可以僅用向?qū)瓿蒘qlDataSource的配置,而無(wú)需編寫(xiě)代碼。除了使用SqlDataSource控件的任務(wù)按鈕啟動(dòng)“數(shù)據(jù)源配置向?qū)А?,通過(guò)SqlDataSource控件的“SelectQuery”屬性,還可以使用“命令和參數(shù)編輯器”向?qū)В矊儆跀?shù)據(jù)源配置向?qū)У囊环N,供開(kāi)發(fā)者更自由地設(shè)置查詢條件。在InputQuery.aspx頁(yè)面設(shè)計(jì)視圖中,依次做如下操作:選中已有靜態(tài)文本、TextBoxBookID控件,敲Delete鍵刪除;重新輸入靜態(tài)文本:“查詢進(jìn)貨數(shù)量多于”;拖入TextBox控件,ID設(shè)為“TextBoxInputQuantity”;輸入靜態(tài)文本:“或者進(jìn)價(jià)高于”;拖入TextBox控件,ID設(shè)為“TextBoxInputPrice”;輸入靜態(tài)文本:“的入庫(kù)記錄”;此處不使用“SqlDataSourceInput”控件任務(wù)按鈕啟動(dòng)配置數(shù)據(jù)源向?qū)?。選中“SqlDataSourceInput”控件,在屬性面板中,單擊“SelectQuery”屬性后的按鈕,啟動(dòng)“命令和參數(shù)編輯器”向?qū)?,如圖6?25;單擊“查詢生成器”按鈕,出現(xiàn)“查詢生成器”對(duì)話框
6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢?cè)凇安樵兩善鳌钡诙案裰芯庉?,刪除“BookID”列的篩選器,輸入“InputPrice”列的篩選器為“>@price”,再輸入“InputQuantity”列的“或”篩選器為“>@quantity”,此處的“price”和“quantity”是自定義的變量名,編輯完畢,單擊“執(zhí)行查詢”單擊“查詢生成器”的“確定”按鈕,返回如圖6?25的“命令和參數(shù)編輯器”,應(yīng)注意到Select命令已經(jīng)變化了,當(dāng)然,也可以在“命令和參數(shù)編輯器”中手工輸入Select命令語(yǔ)句,而不使用“查詢生成器”;在“命令和參數(shù)編輯器”中,選中參數(shù)“BookID”,單擊按鈕,然后單擊“刷新參數(shù)”按鈕;選中“price”參數(shù),選擇“Control”參數(shù)源,選擇ControlID為“TextBoxInputPrice”,選擇后,參數(shù)值自動(dòng)變?yōu)椤癟extBoxInputPrice.Text”,這是應(yīng)為T(mén)ext是文本框的缺省屬性,如果所選控件的缺省屬性不是所需要的參數(shù)來(lái)源,可以單擊“顯示高級(jí)屬性”鏈接,進(jìn)一步選擇所選控件的哪個(gè)屬性作為參數(shù)來(lái)源;類似地設(shè)置“quantity”的參數(shù)源,設(shè)置完畢后單擊“確定”按鈕。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢?cè)贗nputQuery.aspx頁(yè)面設(shè)計(jì)視圖中,依次做如下操作:選中已有靜態(tài)文本、文本框控件,敲Delete鍵刪除;重新輸入靜態(tài)文本:“請(qǐng)輸入要查詢的起始入庫(kù)日期:”;拖入TextBox控件,ID設(shè)為“TextBoxInputTimeStart”;拖入ImageButton控件,ID設(shè)為“ImageButtonShowHideCalendarStart”;拖入Calendar控件,ID設(shè)為“CalendarStart”,Visible設(shè)為false,使用任務(wù)按鈕自動(dòng)套用格式,選擇“彩色型1”,如圖6?31;回車(chē);輸入靜態(tài)文本:“請(qǐng)輸入要查詢的終止入庫(kù)日期:”;拖入TextBox控件,ID設(shè)為“TextBoxInputTimeEnd”;拖入ImageButton控件,ID設(shè)為“ImageButtonShowHideCalendarEnd”;拖入Calendar控件,ID設(shè)為“CalendarEnd”,Visible設(shè)為false,使用任務(wù)按鈕自動(dòng)套用格式,選擇“彩色型2”,以與CalendarStart控件區(qū)別顯示;回車(chē)6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢使用與上例相似的步驟,通過(guò)“SqlDataSourceInput”控件的“SelectQuery”可視屬性,使用“命令和參數(shù)編輯器”,修改其命令和參數(shù)單擊“確定”,完成SqlDataSourceInput的配置。雙擊“ImageButtonShowHideCalendarStart”按鈕,在InputQuery.aspx.cs代碼編輯器中編寫(xiě)其Click事件委托函數(shù)如下:protectedvoidImageButtonShowHideCalendarStart_Click(objectsender,ImageClickEventArgse){CalendarStart.Visible=!CalendarStart.Visible;}代碼中只有一個(gè)賦值語(yǔ)句,將“CalendarStart”控件的Visble屬性置為原來(lái)的相反值,即若原來(lái)日歷控件隱藏,單擊此圖片按鈕后就顯示;若原來(lái)是顯示的,單擊后就隱藏。6.3.2使用SqlDataSource數(shù)據(jù)源控件實(shí)現(xiàn)靜態(tài)查詢雙擊“CalendarStart”控件,在代碼編輯器中編寫(xiě)其SelectionChanged事件委托函數(shù)如下:protectedvoidCalendarStart_SelectionChanged(objectsender,EventArgse){TextBoxInputTimeStart.Text=CalendarStart.SelectedDate.ToShortDateString();CalendarStart.Visible=false;}這段代碼將在用戶選擇了日歷控件的一個(gè)日期后,回發(fā)并執(zhí)行。代碼中有兩個(gè)賦值語(yǔ)句,第一句完成將用戶在日歷控件中選擇的日期轉(zhuǎn)換為T(mén)-SQL可識(shí)別的日期文本,并填入“TextBoxInputTimeStart”文本框的功能;第二句完成隱藏日歷控件的功能。對(duì)終止日期的“ImageButtonShowHideCalendarEnd”按鈕和“CalendarEnd”控件,做上述類似的操作,相關(guān)代碼如下:protectedvoidImageButtonShowHideCalendarEnd_Click(objectsender,ImageClickEventArgse){CalendarEnd.Visible=!CalendarEnd.Visible;}protectedvoidCalendarEnd_SelectionChanged(objectsender,EventArgse){TextBoxInputTimeEnd.Text=CalendarEnd.SelectedDate.ToShortDateString();CalendarEnd.Visible=false;}在瀏覽器中查看頁(yè)面,通過(guò)單擊圖片按鈕,顯示日歷控件,單擊日歷控件中的一個(gè)日期,自動(dòng)填入查詢參數(shù),最后單擊“提交”按鈕查看查詢結(jié)果。本例編寫(xiě)了一點(diǎn)程序,只是為了方便用戶使用,并沒(méi)有為配置查詢而編寫(xiě)程序。6.4基本知識(shí)2:常用數(shù)據(jù)綁定控件及基本數(shù)據(jù)操作
6.4.1DropDownList等列表類綁定控件及列表?xiàng)l件查詢6.4.2GridView控件及主從表顯示6.4.3DetailsView控件及單條數(shù)據(jù)修改6.4.4FormView控件及單條數(shù)據(jù)修改的靈活布局6.4.5DataList控件及數(shù)據(jù)顯示的靈活布局6.4.1DropDownList等列表類綁定控件及列表?xiàng)l件查詢
DropDownList控件的列表項(xiàng)可以直接在Items集合屬性中指定;也可以做數(shù)據(jù)綁定,從數(shù)據(jù)庫(kù)中獲取列表項(xiàng)。每個(gè)列表項(xiàng)是一個(gè)ListItem類對(duì)象,ListItem包含以下主要屬性:Text屬性:列表項(xiàng)的顯示文本;Value屬性:列表項(xiàng)的值,一般是顯示文本對(duì)應(yīng)的某種編碼,也可以與Text相同。DropDownList做數(shù)據(jù)綁定時(shí),需要設(shè)置以下屬性:用DataSourceID屬性指定數(shù)據(jù)源;DataTextField屬性指定列表項(xiàng)的Text屬性;DataValueField屬性指定列表項(xiàng)的Value屬性。6.4.2GridView控件及主從表顯示
GridView控件以表格形式顯示數(shù)據(jù)源的數(shù)據(jù),其結(jié)構(gòu)由列(Columns)決定,每數(shù)據(jù)列對(duì)應(yīng)一個(gè)字段(Field),而每數(shù)據(jù)行對(duì)應(yīng)一條記錄。GridView控件是功能強(qiáng)大的數(shù)據(jù)綁定控件,僅僅配置其基本屬性就可以套用格式、實(shí)現(xiàn)分頁(yè)/排序/選擇/編輯/刪除等功能;還可以詳細(xì)配置每列的屬性;而作為一種模板化的復(fù)合控件,除了數(shù)據(jù)行,還有標(biāo)題行、腳注行、頁(yè)導(dǎo)航行等,每種行的每列都可以作為普通控件的容器使用;GridView控件還提供了多種事件,供開(kāi)發(fā)人員編寫(xiě)程序,靈活控制控件的顯示和行為。6.4.2GridView控件及主從表顯示1、基本配置自動(dòng)套用格式為了美化顯示,ASP.NET為GridView預(yù)定義了多種顯示樣式,使用GridView控件的任務(wù)按鈕,單擊首項(xiàng)“自動(dòng)套用格式…”,即可在出現(xiàn)的對(duì)話框中選擇一種預(yù)定義的顯示樣式,如圖6?40所示。選擇“移除格式設(shè)置”即為不使用預(yù)定義格式。6.4.2GridView控件及主從表顯示分頁(yè)分頁(yè)功能,是為了解決由于客戶端一次顯示全部數(shù)據(jù),而可能會(huì)造成的網(wǎng)絡(luò)擁塞、響應(yīng)遲緩問(wèn)題。在數(shù)據(jù)源控件的支持下,對(duì)GridView分頁(yè)非常簡(jiǎn)單,只需要在GridView控件的任務(wù)按鈕中選中“啟用分頁(yè)”即可?!癙ageSize”屬性用于設(shè)置每頁(yè)的數(shù)據(jù)行數(shù),如果需要改變默認(rèn)的分頁(yè)風(fēng)格,可以進(jìn)一步設(shè)置GridView控件的“PagerSettings”、“PagerStyle”屬性。排序單擊列標(biāo)題鏈接按鈕,使數(shù)據(jù)表按照本列進(jìn)行升、降序排列,實(shí)現(xiàn)這一功能,也只需在任務(wù)按鈕中選中“啟用排序”。選定在任務(wù)按鈕中選中“啟用選定內(nèi)容”后,GridView中每個(gè)數(shù)據(jù)行會(huì)多出一列,其中包含一個(gè)“選擇”鏈接按鈕,在瀏覽器中查看頁(yè)面時(shí),單擊“選擇”,就會(huì)選中該行,可以設(shè)置“SelectedRowStyle”屬性以使選中行突出顯示6.4.2GridView控件及主從表顯示某行被選中后,GridView控件的一些屬性值還會(huì)自動(dòng)發(fā)生以下變化:SelectedIndex置為選中數(shù)據(jù)行的索引;SelectedRow為GirdView控件的選中行,選中行的狀態(tài)為“Selected”(而不是Normal);SelectedDataKey為選中數(shù)據(jù)行的主鍵值(GridView的DataKeyNames屬性設(shè)置了所綁定數(shù)據(jù)表的主鍵字段名稱。若是組合主鍵,各字段名間以逗號(hào)分隔,此時(shí)SelectedDataKey是可索引的);SelectedValue為選中數(shù)據(jù)行的第一個(gè)主鍵字段值,即SelectedValue等于SelectedDataKey[0]。利用上述特性,我們可以進(jìn)行主從表同步綁定顯示。6.4.2GridView控件及主從表顯示數(shù)據(jù)綁定控件在功能上與數(shù)據(jù)源控件緊密結(jié)合。如果數(shù)據(jù)源控件配置了UpdateCommand和DeleteCommand屬性,GridView控件還可以啟用編輯和刪除功能。即使數(shù)據(jù)源控件配置了InsertCommand屬性,GridView控件也不具備插入功能。跟“啟用選定內(nèi)容”類似,啟用了編輯、刪除后,將在每個(gè)數(shù)據(jù)行都添加“編輯”、“刪除”鏈接按鈕,即GridView控件的數(shù)據(jù)交互是按照“行”進(jìn)行管理的。6.4.2GridView控件及主從表顯示6.4.2GridView控件及主從表顯示2、分列詳細(xì)設(shè)置及友好顯示前面例子中,數(shù)據(jù)表的顯示很有很多不足,比如:列標(biāo)題是否可以顯示為漢字?時(shí)間列是否可以顯示為“年月日”的形式顯示?“選擇”列可否顯示為“明細(xì)”?可否將“編輯”列放在表格中的最右側(cè)?這些問(wèn)題,都可以通過(guò)單擊任務(wù)按鈕的“編輯列…”,在“字段”對(duì)話框中進(jìn)行詳細(xì)設(shè)置來(lái)解決。對(duì)列做的改動(dòng),將會(huì)影響標(biāo)題行、所有數(shù)據(jù)行、尾行等。對(duì)話框由以下主要組成部分:“可用字段”列表,列出了可能添加到GridView控件中的全部字段,單擊“添加”按鈕,即可加入到“選定的字段”列表,包括:“所有字段”:選定所有可能字段;“BoundField”:包括數(shù)據(jù)源控件提供的所有可綁定字段,如果未顯示任何字段,單擊此對(duì)話框左下方“刷新架構(gòu)”鏈接即可;“CheckedBoxField”:包括數(shù)據(jù)源控件提供的布爾型(bit型)字段,將顯示為CheckedBox控件,如果數(shù)據(jù)源未提供此類型字段,則可將一個(gè)暫未綁定的CheckBox控件列添加到選定列表,但可以在此對(duì)話框的“屬性”部分完成綁定;6.4.2GridView控件及主從表顯示“HyperLinkField”:選定一個(gè)暫未綁定的HyperLink控件列;“ImageField”:選定一個(gè)暫未綁定的Image控件列;“ButtonField”:選定一個(gè)暫未綁定的按鈕控件列,默認(rèn)為“LinkButton”類按鈕,但可以在此對(duì)話框的“屬性”部分修改為“Button”或“ImageButton”類按鈕;“CommandField”:包含數(shù)據(jù)綁定控件(包括GridView)內(nèi)置的命令按鈕,所謂內(nèi)置,是指數(shù)據(jù)綁定控件自動(dòng)識(shí)別它們并執(zhí)行特定的命令;“TemplateField”:選定一個(gè)功能強(qiáng)大的模板列,也可以選中一個(gè)選定的字段后,單擊此對(duì)話框右下方“將此字段轉(zhuǎn)換為T(mén)emplateField”,來(lái)得到一個(gè)模板列,隨后將詳細(xì)探討模板列。
6.4.2GridView控件及主從表顯示“選定的字段”列表,列出了從“可用字段”中添加的字段標(biāo)題,這些列將顯示在GridView中。選中其中之一(除了模板列),將在此對(duì)話框的“屬性”區(qū)域顯示該列的屬性。右側(cè)三個(gè)按鈕可調(diào)整顯示順序(最上的在GridView最左側(cè)顯示)和取消選定。“自動(dòng)生成字段”復(fù)選框,選中時(shí),表示不在此對(duì)話框中選定列,而是順序顯示數(shù)據(jù)源控件提供的所有可綁定字段,此時(shí)“選定的列”列表如果不為空,將可能有重復(fù)的列。“屬性”區(qū)域,供查看和修改“選定的列”中選中列的屬性。隨后將按照需求詳細(xì)探討。目前,“選定的列”列表中,依次已有:選擇CommandField、各個(gè)BoundField。6.4.2GridView控件及主從表顯示分析:要使訂單詳細(xì)表顯示更友好,應(yīng)該修改“SqlDataSourceOrderDetails”控件的SelectCommand,從圖書(shū)信息表Books中選取相關(guān)的圖書(shū)信息:圖書(shū)名稱、作者、原價(jià)、折扣、數(shù)量、金額等,其中“金額”在圖書(shū)信息表中并不存在,是一個(gè)計(jì)算列。這些修改可以用“命令和參數(shù)編輯器”生成。要使訂單表中顯示送貨方式名稱,需要修改“SqlDataSourceOrders”控件的SelectCommand,進(jìn)行多表查詢,從Orders表中獲得訂單信息的同時(shí),從SendModes表中獲取每個(gè)SendModeID對(duì)應(yīng)的名稱;6.4.2GridView控件及主從表顯示訂單表的Update和Delete的邏輯要求:對(duì)于前臺(tái)個(gè)人訂單頁(yè)面,只允許個(gè)人修改“收件人”、“地址”、“郵編”、“電話”、“送貨方式”、“付款方式”信息;而刪除操作時(shí),由于表間約束,必須先刪除訂單詳細(xì)表OrderDetails中對(duì)應(yīng)OrderID的所有記錄,才可刪除訂單表中的此OrderID的記錄。訂單詳細(xì)表的Update和Delete操作邏輯要求:只允許修改“購(gòu)買(mǎi)數(shù)量”,其他無(wú)特殊要求。要啟用修改和刪除,必須先配置數(shù)據(jù)源控件的UpdateCommand和InsertCommand屬性,由于本例中修改和刪除操作的特殊要求,不宜單擊類似圖6?19中的“高級(jí)…”按鈕來(lái)自動(dòng)生成默認(rèn)的Update和Delete命令,用類似圖6?25的“命令和參數(shù)編輯器”生成更合適,但訂單表的刪除操作包含兩個(gè)Delete命令,需要手工輸入。6.4.2GridView控件及主從表顯示查看aspx頁(yè)面標(biāo)記代碼,可發(fā)現(xiàn)“SqlDataSourceOrders”控件添加了如下UpdateParameters屬性集合:<UpdateParameters><asp:ParameterName="Recipient"/><asp:ParameterName="Address"/><asp:ParameterName="Postalcode"/><asp:ParameterName="Phone"/><asp:ParameterName="SendModeID"/><asp:ParameterName="PayModeID"/><asp:ParameterName="OrderID"/></UpdateParameters>6.4.2GridView控件及主從表顯示6.4.2GridView控件及主從表顯示3、使用模板列模板的概念模板(Template)是數(shù)據(jù)綁定等控件的一種強(qiáng)大功能,GridView控件的普通列只可以包含一個(gè)子控件用來(lái)顯示或編輯字段,模板列可以包含各種HTML標(biāo)記和服務(wù)器控件,并能夠像對(duì)網(wǎng)頁(yè)布局那樣進(jìn)行子控件的布局,還可以創(chuàng)建獨(dú)立于父控件的子控件事件委托函數(shù)。數(shù)據(jù)綁定控件的模板技術(shù)使得子控件不但可以自動(dòng)重復(fù)綁定數(shù)據(jù),而且可以自由布局和定制行為,不同的狀態(tài)下(如顯示狀態(tài)、編輯狀態(tài))還可以包含不同的子控件。ASP.NET包含若干模板化的控件,模板不是GridView控件獨(dú)有的技術(shù)。分類列模板:模板在GridView控件中是按列定義的,即定義一個(gè)模板列,則GridView控件所有數(shù)據(jù)行的此單元格,都將具備此列模板定義的外觀和行為,也就是數(shù)據(jù)是在某列按行重復(fù)綁定的,行變列不變。行模板:行模板用來(lái)控制數(shù)據(jù)綁定控件的整體外觀和行為,如GridView、DetailsView、FormView等控件都支持按行定義的“PagerTemplate”(頁(yè)導(dǎo)航行模板),還支持“EmptyDataTemplate”(綁定數(shù)據(jù)為空時(shí)的模板)等。狀態(tài)模板:每個(gè)模板可能處于多種交互狀態(tài),如GridView是按行管理數(shù)據(jù)交互的,也就是數(shù)據(jù)狀態(tài)按行變化,包括標(biāo)題行、正常顯示行、交替行顯示行(偶數(shù)行)、編輯行、腳注行,對(duì)應(yīng)的模板為“ItemTemplate”、“AlternatingItemTemplate”、“EditTemplate”、“HeaderTemplate”、“FooterTemplate”,GridView的每個(gè)模板列都可能有這些狀態(tài)6.4.2GridView控件及主從表顯示應(yīng)用在希望自由布局并數(shù)據(jù)綁定的場(chǎng)合,都可以使用數(shù)據(jù)綁定控件的模板。下面我們用模板列來(lái)解決例6?10中編輯行的問(wèn)題。6.4.2GridView控件及主從表顯示6.4.2GridView控件及主從表顯示4、GridView事件編程概念如前所述,GridView控件的數(shù)據(jù)交互是按行進(jìn)行的,其事件也是按行被觸發(fā)的。我們用到的事件有:RowCreated、RowDataBound、RowCommand等,其中RowCreated在創(chuàng)建行后發(fā)生,RowDataBound在行數(shù)據(jù)綁定后發(fā)生,RowCommand則響應(yīng)行中的按鈕單擊事件。還有RowDeleting、RowDeleted、RowUpdating、RowUpdated等事件,分別對(duì)應(yīng)數(shù)據(jù)行刪除前、刪除后、更新前、更新后等時(shí)機(jī)。ASP.NET是基于事件的編程,靈活使用事件非常重要,事件處理的順序與控件生命周期密切相關(guān)。控件的生命周期保持與頁(yè)面保持同步。應(yīng)用使用RowCreated、RowDataBound事件時(shí),要注意除了數(shù)據(jù)行外,標(biāo)題行、腳注行也會(huì)引發(fā)此類事件。另外,每行各列中的子控件在Page對(duì)象中是不可見(jiàn)的,必須用Controls集合索引或FindControl方法來(lái)訪問(wèn)這些控件。處理GridView行的RowCommand事件時(shí),有以下規(guī)則:GridView某行中的多個(gè)按鈕,用按鈕的CommandName屬性區(qū)分。此外,GridView是按列設(shè)計(jì)呈現(xiàn)的,每個(gè)行都具有相同CommandName的按鈕,再用按鈕的CommandArgument屬性存儲(chǔ)所處的行索引,以區(qū)分行。6.4.2GridView控件及主從表顯示GridView控件提供了選擇、排序、分頁(yè)、編輯、更新、取消、刪除等內(nèi)置功能,為按鈕指定特定的CommandName就可以調(diào)用這些功能,會(huì)自動(dòng)給CommandArgument屬性賦值、自動(dòng)執(zhí)行內(nèi)置功能,如果僅需實(shí)現(xiàn)內(nèi)置功能,就不必再編寫(xiě)事件代碼。上述內(nèi)置功能的CommandName分別是:“Select”、“Sort”、“Page”、“Edit”、“Update”、“Cancel”、“Delete”。其他數(shù)據(jù)綁定控件還提供“Insert”、“New”命令。按鈕一般置于CommandField列、ButtonField列或模板列,模板列的按鈕可以有獨(dú)立的事件委托函數(shù),而不觸發(fā)RowCommand事件。模板列中自定義功能(非內(nèi)置功能)的按鈕,不會(huì)自動(dòng)給CommandArgument屬性賦值,可以在RowCreated或RowDataBound事件中訪問(wèn)該按鈕,給其CommandArgument屬性賦自定義的值。我們僅舉例完成前面例子設(shè)計(jì)的OrderInfo.aspx頁(yè)面中,刪除提示和訂單詳細(xì)表中金額合計(jì)的功能。6.4.2GridView控件及主從表顯示6.4.3etailsView控件及單條數(shù)據(jù)修改
GridView控件功能強(qiáng)大,但沒(méi)有內(nèi)置的插入新增記錄功能,ASP.NET中最方便的可插入新增記錄控件是DetailsView。DetailsView控件與GridView控件外觀和功能上都很相似:以表格形式顯示數(shù)據(jù),內(nèi)置了綁定、分頁(yè)、插入、編輯、刪除功能,支持模板功能,但每頁(yè)只顯示一條記錄,每行(Row)顯示一個(gè)字段(Field)。DetailsView控件的模式對(duì)應(yīng)數(shù)據(jù)交互的狀態(tài)。DetailsViewMode枚舉類型的屬性DefaultMode代表DetailsView控件的默認(rèn)模式,屬性CurrentMode則代表當(dāng)前模式,如“DetailsViewOrder.CurrentMode”值為“DetailsViewMode.Insert”表示“DetailsViewOrder”控件正處在插入新增記錄狀態(tài)。通過(guò)操作,我們發(fā)現(xiàn):本例可以對(duì)類別進(jìn)行增、刪、改操作,但由于無(wú)法直觀看到所有的類別數(shù)據(jù),操作起來(lái)很盲目;由于類別數(shù)據(jù)是樹(shù)形層級(jí)結(jié)構(gòu)的,一般情況下,只存在葉子類別的圖書(shū),也就是父類別并不受外鍵關(guān)系的約束,因此無(wú)法在數(shù)據(jù)庫(kù)管理系統(tǒng)中被保護(hù),這樣,使用本頁(yè)面進(jìn)行類別管理就可能出現(xiàn)葉子類不可刪除,但其父類已經(jīng)被誤刪的情況。要解決第一個(gè)問(wèn)題,可以為網(wǎng)頁(yè)添加一個(gè)GridView控件,查看所有類別數(shù)據(jù),但這種方法不能直觀顯示類別間的層級(jí)關(guān)系,我們使用一個(gè)自定義的“UC_CategoryTree”用戶控件代替GridView;要解決第二個(gè)問(wèn)題,需要進(jìn)行事件編程,在把Delete命令提交給SQLServer之前,判斷當(dāng)前類別及其所有子類(下稱“類別家族”)是否包含圖書(shū),僅對(duì)空類別家族(不包含圖書(shū))提交刪除命令。6.4.3etailsView控件及單條數(shù)據(jù)修改
結(jié)合界面設(shè)計(jì),分析動(dòng)作流程可知,需編程解決以下問(wèn)題:根據(jù)管理員選中的節(jié)點(diǎn),給“LabelSelectedCategoryId”控件賦值;若要新建類別為當(dāng)前類別的子類別,應(yīng)將當(dāng)前類別ID填入新類別的“父ID”字段;按照當(dāng)前節(jié)點(diǎn)對(duì)應(yīng)的類別家族,判斷其是否包含圖書(shū)信息;調(diào)用“SqlDataSourceCategorys”的功能刪除當(dāng)前類別;通過(guò)客戶端腳本給管理員提示框。進(jìn)行以上編程需要調(diào)用App_Code文件夾中的Db類,以及類別樹(shù)控件的功能
6.4.3etailsView控件及單條數(shù)據(jù)修改
屬性:CurrentNode:只讀,表示管理員選中的節(jié)點(diǎn),TreeNode類型,其Text、Value、ToolTip子屬性,分別對(duì)應(yīng)CategoryName、CategoryID、CategoryDescription數(shù)據(jù);事件:SelectedNodeChanged:管理員改變對(duì)節(jié)點(diǎn)的選擇時(shí)發(fā)生,是EventHandler類型,只需object和EventArgs類型的兩個(gè)參數(shù);方法:RefreshCategoryTree:使類別樹(shù)與數(shù)據(jù)庫(kù)同步,并選中、展開(kāi)指定CategoryID值的類別節(jié)點(diǎn),無(wú)返回值,形參preSelectedNodeValue是字符串類型,表示TreeNode類型的Value,包含指定的CategoryID值,若為null,則選中、展開(kāi)根節(jié)點(diǎn);SetCurrentNodeByValue:僅選中、展開(kāi)指定類別節(jié)點(diǎn),參數(shù)與RefreshCategoryTree方法相同。6.4.3etailsView控件及單條數(shù)據(jù)修改
在CategorysManage.aspx.cs中,編寫(xiě)Page_Load事件委托函數(shù)代碼如下:protectedvoidPage_Load(objectsender,EventArgse){UC_CategoryTree1.SelectedNodeChanged+=newEventHandler(UC_CategoryTree1_SelectedNodeChanged);}6.4.3etailsView控件及單條數(shù)據(jù)修改
在輸入上述代碼時(shí),輸入完“+=”后連續(xù)按兩次“Tab”鍵,代碼助手即自動(dòng)建立類別樹(shù)控件的SelectedNodeChanged事件委托函數(shù)聲明,再以賦值語(yǔ)句替換自動(dòng)生成的“throw”語(yǔ)句,以實(shí)現(xiàn)在管理員選擇不同的節(jié)點(diǎn)時(shí),用Label控件得到所選類別ID,代碼如下:voidUC_CategoryTree1_SelectedNodeChanged(objectsender,EventArgse){LabelSelectedCategoryId.Text=UC_CategoryTree1.CurrentNode.Value;}6.4.3etailsView控件及單條數(shù)據(jù)修改
為協(xié)助管理員建立當(dāng)前類別的子類別,編寫(xiě)“DetailsViewCategory”控件的DataBound事件委托函數(shù)如下:protectedvoidDetailsViewCategory_DataBound(objectsender,EventArgse){if(DetailsViewCategory.CurrentMode==DetailsViewMode.Insert){((TextBox)DetailsViewCategory.Rows[2].Cells[1].Controls[0]).Text=LabelSelectedCategoryId.Text;((TextBox)DetailsViewCategory.Rows[1].Cells[1].Controls[0]).Focus();}}6.4.3etailsView控件及單條數(shù)據(jù)修改
刪除功能,ItemDeleting事件委托函數(shù)如下:protectedvoidDetailsViewCategory_ItemDeleting(objectsender,DetailsViewDeleteEventArgse){if(!Db.CanDeleteCategory(UC_CategoryTree1.CurrentNode))//若不允許刪除{e.Cancel=true;//取消內(nèi)置的刪除動(dòng)作。ClientScript.RegisterStartupScript(typeof(Page),“DeleteError”,“alert(‘不能刪除此類別,因?yàn)榇嬖诖祟悇e的圖書(shū)’);”,true);//注冊(cè)頁(yè)面的啟動(dòng)腳本,在瀏覽器彈出對(duì)話框。}}6.4.3etailsView控件及單條數(shù)據(jù)修改
6.4.4FormView控件及單條數(shù)據(jù)修改的靈活布局
FormView控件和DetailsView控件很相似,每頁(yè)只顯示一條記錄,默認(rèn)情況下每行(Row)顯示一個(gè)字段(Field),F(xiàn)ormView控件和DetailsView控件的區(qū)別在于FormView允許自定義布局,其每個(gè)模式(Mode),都有對(duì)應(yīng)的模板,比如,我們?cè)谛薷膱D書(shū)信息時(shí),希望“圖書(shū)圖片在左面顯示,右面每行顯示兩個(gè)字段……”,要實(shí)現(xiàn)類似這樣的要求,同時(shí)還要使用數(shù)據(jù)綁定的功能,這就需要使用FormView控件,編輯其EditItemTemplate模板來(lái)實(shí)現(xiàn)。用戶控件“UC_UploadImageFile”是一個(gè)增強(qiáng)的FileUpload控件,適合處理需將路徑存儲(chǔ)到數(shù)據(jù)庫(kù)的圖像文件,其公開(kāi)成員包括:屬性:AllowNull:獲取或設(shè)置是否允許不上傳文件,為false值而用戶未選擇客戶端文件時(shí),將填寫(xiě)錯(cuò)誤信息;AllowedFileTypesFilter:允許上傳的文件類型,以“|”分隔的帶點(diǎn)文件擴(kuò)展名字符串;方法:UploadImgFile方法:執(zhí)行檢查文件類型,按照指定的文件名保存文件,得到編碼的虛擬根路徑,以及錯(cuò)誤信息,返回是否上傳成功。參數(shù)serverVirtualRootFileNameWithoutExtension是指定的文件名,不含擴(kuò)展名的虛擬根路徑,如“~/BookPics/C#_李正吉”;引用參數(shù)serverVirtualRootFileNameForDb是編碼過(guò)的含擴(kuò)展名文件名,如“~/BookPics/C%23_%e6%9d%8e%e6%ad%a3%e5%90%89.jpg”,編碼的原因?yàn)椤?”等字符是Url保留字符,將導(dǎo)致圖書(shū)信息顯示頁(yè)面中無(wú)法顯示圖片,若沒(méi)有上傳文件且AllowNull為true,該參數(shù)保持原值;輸出參數(shù)errorMsg包含了錯(cuò)誤字符串。6.4.3etailsView控件及單條數(shù)據(jù)修改
Page_Load事件委托函數(shù)代碼如下:protectedvoidPage_Load(objectsender,EventArgse){UserControls_UC_CategoryTreecategoryTree=(UserControls_UC_CategoryTree)FormViewBookEdit.FindControl("UC_CategoryTree1");categoryTree.SelectedNodeChanged+=categoryTree_SelectedNodeChanged;}注意類別樹(shù)控件的類型名為“UserControls_UC_CategoryTree”,其中“UserControls_”是在“UserControls”文件夾下建立用戶控件類的默認(rèn)前綴。6.4.3etailsView控件及單條數(shù)據(jù)修改
類別樹(shù)控件SelectedNodeChanged事件委托函數(shù)代碼如下:voidcategoryTree_SelectedNodeChanged(objectsender,EventArgse){UserControls_UC_CategoryTreecategoryTree=(UserControls_UC_CategoryTree)sender;TextBoxtbCategoryId=(TextBox)(categoryTree.Parent).FindControl("TextBoxCategoryID");tbCategoryId.Text=categoryTree.CurrentNode.Value;categoryTree.Visible=false;}由于事件是類別樹(shù)控件發(fā)出的,所以類別樹(shù)控件可以由參數(shù)sender直接轉(zhuǎn)換得到,而“TextBoxCategoryID”文本框是和類別樹(shù)控件同屬一個(gè)容器的子控件,所以,在類別樹(shù)控件的Parent控件中可以找到類別文本框,將類別樹(shù)控件中當(dāng)前節(jié)點(diǎn)的Value(即類別ID)填入文本框后,隱藏類別樹(shù)控件。6.4.3etailsView控件及單條數(shù)據(jù)修改
“ImageButtonShowCategoryTree”按鈕用于顯示/隱藏類別樹(shù)控件,其Click事件委托函數(shù)如下:protectedvoidImageButtonShowCategoryTree_Click(objectsender,ImageClickEventArgse){UserControls_UC_CategoryTreecategoryTree=(UserControls_UC_CategoryTree)((senderasImageButton).Parent.FindControl("UC_CategoryTree1"));categoryTree.Visible=!categoryTree.Visible;if(categoryTree.Visible){//調(diào)用類別樹(shù)控件的SetCurrentNodeByValue方法選中、展開(kāi)當(dāng)前類別對(duì)應(yīng)的節(jié)點(diǎn)TextBoxtbCategoryId=(TextBox)(categoryTree.Parent).FindControl("TextBoxCategoryID");categoryTree.SetCurrentNodeByValue(tbCategoryId.Text);}}6.4.3etailsView控件及單條數(shù)據(jù)修改
6.4.5DataList控件及數(shù)據(jù)顯示的靈活布局
與GridView、DetailsView、FormView控件相比,DataList控件更接近FormView控件,允許自定義各種模板,但僅僅自動(dòng)生成ItemTemplate模板,并且需要自己編程實(shí)現(xiàn)排序、分頁(yè)、編輯、刪除功能。適合開(kāi)發(fā)人員希望得到更多布局靈活性,而不是數(shù)據(jù)操作方便性的場(chǎng)合。DataList控件能夠通過(guò)屬性控制布局樣式,比如表格式布局或者流式布局(即依次排列),并且可以設(shè)置水平方向或垂直方向重復(fù)顯示多少條記錄,網(wǎng)上書(shū)店管理系統(tǒng)的首頁(yè)使用DataList控件顯示圖書(shū)的概要信息,設(shè)置為水平方向重復(fù)3列。DataList控件也提供了設(shè)置這些布局屬性的專用界面,如圖6?71,單擊任務(wù)按鈕中的“屬性生成器…”鏈接或?qū)傩悦姘逯械陌粹o,都會(huì)打開(kāi)一個(gè)用來(lái)設(shè)置布局的屬性對(duì)話框。使用DataList控件顯示新上架圖書(shū)的概要信息。新建“Default.aspx”頁(yè)面,插入3行1列的布局表格,第一行單元格放入Literal控件“LiteralTitle”第二行放入水平分隔線,第三行拖入DataList控件,設(shè)置其屬性EnableViewState為“False”,以減少客戶端和服務(wù)器端的數(shù)據(jù)往返,Width屬性為“100%”,RepeatDirection屬性為“Horizontal”,RepeatColumns屬性為“3”,CellSpacing屬性為“10”,再為其新建數(shù)據(jù)庫(kù)數(shù)據(jù)源“SqlDataSourceSearchBooks”,與前例使用相同的數(shù)據(jù)庫(kù)連接,配置SelectCommand為以下SQL語(yǔ)句:"selecttop6BookID,BookImage,BookName,BookPublisher,BookPublishDate,BookAuthor,BookPrice,BookDiscountfromBooksorderbyBookAddTimedesc"6.4.3etailsView控件及單條數(shù)據(jù)修改
在標(biāo)記代碼源視圖,<head>標(biāo)記中,鍵入如下的CSS標(biāo)記代碼:<styletype="text/css">.bookTitle{text-align:left;color:#1a66b3;font-size:14px;padding-top:5px;padding-left:5px;padding-right:10px;padding-bottom:5px;height:30px;overflow:hidden;}6.4.3etailsView控件及單條數(shù)據(jù)修改
.bookInfo{text-align:left;font-size:13px;padding-top:5px;padding-left:5px;padding-right:6pxpadding-bottom:5px;height:70px;overflow:hidden;}.bookDiscount{text-align:left;font-size:13px;padding-top:5px;padding-left:5px;padding-right:10px;padding-bottom:5p
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 金融服務(wù)行業(yè)勞務(wù)外包協(xié)議書(shū)
- 格力物業(yè):2022年年度報(bào)告
- 日式木屐帶產(chǎn)品入市調(diào)查研究報(bào)告
- 登機(jī)用引橋市場(chǎng)洞察報(bào)告
- 電動(dòng)修發(fā)器產(chǎn)業(yè)規(guī)劃專項(xiàng)研究報(bào)告
- 汽車(chē)上光蠟產(chǎn)品入市調(diào)查研究報(bào)告
- 燃?xì)鉅t托架市場(chǎng)洞察報(bào)告
- 塑料瓶產(chǎn)品入市調(diào)查研究報(bào)告
- 精簡(jiǎn)版建筑工人勞動(dòng)合同
- 2024年居間合同起訴狀范本
- 醫(yī)美加盟模板課件
- 部編三年級(jí)上語(yǔ)文《17 古詩(shī)三首》優(yōu)質(zhì)教學(xué)設(shè)計(jì)
- 甾體化合物的微生物轉(zhuǎn)化課件
- 乒乓球一級(jí)裁判培訓(xùn)班規(guī)程講座課件
- 公路工程施工現(xiàn)場(chǎng)安全檢查手冊(cè)
- 海水淡化預(yù)處理過(guò)程概要課件
- 產(chǎn)品質(zhì)量保障方案
- 李白的性格思想課件
- (完整版)標(biāo)書(shū)密封條格式word
- 財(cái)務(wù)會(huì)計(jì)費(fèi)用原始憑證分割單
- 湘教版高中地理必修1自然地理環(huán)境的整體性教案
評(píng)論
0/150
提交評(píng)論