科創(chuàng)學(xué)院Web應(yīng)用開發(fā)課件-第六章-使用數(shù)據(jù)庫技術(shù)實現(xiàn)后臺管理_第1頁
科創(chuàng)學(xué)院Web應(yīng)用開發(fā)課件-第六章-使用數(shù)據(jù)庫技術(shù)實現(xiàn)后臺管理_第2頁
科創(chuàng)學(xué)院Web應(yīng)用開發(fā)課件-第六章-使用數(shù)據(jù)庫技術(shù)實現(xiàn)后臺管理_第3頁
科創(chuàng)學(xué)院Web應(yīng)用開發(fā)課件-第六章-使用數(shù)據(jù)庫技術(shù)實現(xiàn)后臺管理_第4頁
科創(chuàng)學(xué)院Web應(yīng)用開發(fā)課件-第六章-使用數(shù)據(jù)庫技術(shù)實現(xiàn)后臺管理_第5頁
已閱讀5頁,還剩131頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

第六學(xué)習(xí)情境:商品采購管理系統(tǒng)6.1學(xué)習(xí)情境引入6.2基礎(chǔ)知識1:網(wǎng)上書店系統(tǒng)的數(shù)據(jù)庫(選學(xué))6.3基礎(chǔ)知識1:數(shù)據(jù)源控件與靜態(tài)查詢6.4基礎(chǔ)知識2:常用數(shù)據(jù)綁定控件及基本數(shù)據(jù)操作6.5基礎(chǔ)知識3:編程實現(xiàn)復(fù)雜的動態(tài)查詢

6.6決策與計劃

6.7實施

6.8檢查與評價6.1學(xué)習(xí)情境引入

6.1.1網(wǎng)上書店后臺管理的功能需求6.1.2網(wǎng)上書店后臺管理的展示(參見第一章)6.1.3網(wǎng)上書店后臺管理技術(shù)分解6.1.1網(wǎng)上書店后臺管理的功能需求

網(wǎng)上書店的后臺管理需要多種管理功能。訂單管理:訂單查詢、處理功能。入庫管理:新書入庫、入庫記錄查詢功能。圖書管理:圖書信息修改、類別管理功能。會員管理功能。6.1.3網(wǎng)上書店后臺管理技術(shù)技能分解

1.技術(shù)分解開發(fā)一個完整的系統(tǒng)需要很多技術(shù),如商品采購管理系統(tǒng)主要應(yīng)用了以下多種技術(shù)。(1)數(shù)據(jù)獲取技術(shù)(2)數(shù)據(jù)綁定控件6.1.3商品采購管理系統(tǒng)開發(fā)技能分解

2.學(xué)習(xí)安排本書按照資訊、學(xué)習(xí)情境引入、基礎(chǔ)知識講解、實施、小結(jié)等幾個階段來創(chuàng)建一個學(xué)習(xí)情境,讀者要把自己置身于這個情境之中,既是學(xué)習(xí)者,又是項目實施者。6.2基礎(chǔ)知識:項目的開發(fā)環(huán)境

6.2.1創(chuàng)建數(shù)據(jù)庫的操作6.2.2業(yè)務(wù)數(shù)據(jù)表6.2.3數(shù)據(jù)表間關(guān)系

6.2.4存儲過程和觸發(fā)器6.2.1創(chuàng)建數(shù)據(jù)庫的操作

1.新建數(shù)據(jù)庫在“解決方案管理器”中,用鼠標右鍵單擊網(wǎng)站名,選擇“添加新項”選項,在出現(xiàn)的對話框中選擇“SQLServer數(shù)據(jù)庫”,輸入數(shù)據(jù)庫文件名“bookStore.mdf”,單擊“添加”按鈕,系統(tǒng)出現(xiàn)如圖6-2所示的警示對話框,選擇“是”,這樣就會建立一個空數(shù)據(jù)庫,而且在“服務(wù)器資源管理器”中將自動建立與該數(shù)據(jù)庫的連接,另外,ASP.NET的保護機制不允許客戶端下載“App_Data”文件夾中的文件,從而可以使數(shù)據(jù)受到保護。在“服務(wù)器資源管理器”中,也可以創(chuàng)建SQLServer數(shù)據(jù)庫。但要注意的是,數(shù)據(jù)庫文件默認存放位置,是所選SQLServer服務(wù)器的數(shù)據(jù)文件夾,比如,SQLServer2005Express服務(wù)器的默認數(shù)據(jù)庫文件位置為:“C:\ProgramFiles\MicrosoftSQLServer\MSSQL.1\MSSQL\Data”,此文件夾中的數(shù)據(jù)庫文件,在發(fā)布網(wǎng)站時,需要再將其復(fù)制到“App_Data”文件夾中,并修改網(wǎng)站的連接字符串。6.2.1創(chuàng)建數(shù)據(jù)庫的操作

6.2.1創(chuàng)建數(shù)據(jù)庫的操作

2添加數(shù)據(jù)庫對象在“App_Data”文件夾中創(chuàng)建新數(shù)據(jù)庫后,在“服務(wù)器資源管理器”中,展開新數(shù)據(jù)庫bookStore.MDF節(jié)點,將自動連接該數(shù)據(jù)庫,并可定義各種數(shù)據(jù)庫對象(1)添加表右擊“表”節(jié)點,選擇“添加新表”,會出現(xiàn)表結(jié)構(gòu)文檔選項卡,就可以定義表結(jié)構(gòu),保存時,會提示輸入表名。6.2.1創(chuàng)建數(shù)據(jù)庫的操作

(2)添加數(shù)據(jù)庫關(guān)系圖右擊“數(shù)據(jù)庫關(guān)系圖”節(jié)點,選擇“添加新關(guān)系圖”,即可選擇已有表,在表視圖間拖動鼠標,即可在表間建立外鍵關(guān)系,如圖6?4,按住OrderDetails表BookID列左側(cè)拖動到Books上,將出現(xiàn)兩個對話框,供選擇表和列,以及修改外鍵關(guān)系的屬性,默認情況下,單擊“確定”即可。按住此處拖動圖6?4可視化添加新關(guān)系圖按住此處拖動6.2.1創(chuàng)建數(shù)據(jù)庫的操作

(3)添加存儲過程右擊“存儲過程”節(jié)點,選擇“添加新存儲過程”,會出現(xiàn)可供編輯的存儲過程文檔選項卡,并已有“CreateProcedure”語句,編輯完成后,單擊工具欄的保存按鈕,即可運行此創(chuàng)建存儲過程的語句。6.2.1創(chuàng)建數(shù)據(jù)庫的操作

(4)添加觸發(fā)器在已經(jīng)添加完成Orders表的情況下,展開“表”節(jié)點,右擊“Orders”,選擇“添加新觸發(fā)器”,會出現(xiàn)可供編輯的觸發(fā)器文檔選項卡,并已有“CreateTrigger”語句,編輯和保存方法與存儲過程6.2.1創(chuàng)建數(shù)據(jù)庫的操作

6.2.2業(yè)務(wù)數(shù)據(jù)表

網(wǎng)上書店數(shù)據(jù)庫包含自動生成的ASP.NET角色和成員資格數(shù)據(jù)部分,以及業(yè)務(wù)數(shù)據(jù)部分,本章僅涉及根據(jù)需求建立的業(yè)務(wù)數(shù)據(jù)部分。6.2.2業(yè)務(wù)數(shù)據(jù)表

1、圖書類別表用于保存圖書類別信息,命名為Categorys。類別信息本身是樹形結(jié)構(gòu)的,通過每個類別的“父類別ID”來轉(zhuǎn)化為關(guān)系結(jié)構(gòu)。該表設(shè)計結(jié)構(gòu)如圖6?5所示。6.2.2業(yè)務(wù)數(shù)據(jù)表

2、圖書信息表用于保存圖書信息,在進貨、銷售、庫存鏈條中,用作庫存表,命名為Books,其結(jié)構(gòu)如圖6?6。3、入庫表用于記錄進貨信息,如圖6?7所示。6.2.2業(yè)務(wù)數(shù)據(jù)表

6.2.2業(yè)務(wù)數(shù)據(jù)表4、用戶表保存了用戶(會員)信息,會員賬戶的其他信息保存在自動生成的ASP.NET角色和成員資格數(shù)據(jù)表中,故此表命名為User2,其結(jié)構(gòu)如圖6?8。關(guān)于ASP.NET角色和成員資格,參見后續(xù)章節(jié)的介紹。6.2.2業(yè)務(wù)數(shù)據(jù)表

5、送貨方式表為規(guī)范管理送貨方式信息,防止用戶輸入混亂,專門建立了送貨方式表,命名為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所示。訂單表中并不保存訂購的圖書信息。6.2.2業(yè)務(wù)數(shù)據(jù)表

8、訂單詳細表每個訂單中訂購的圖書詳細信息,保存在表OrderDetails中,其結(jié)構(gòu)如圖6?126.2.3數(shù)據(jù)表間關(guān)系

為避免誤操作,根據(jù)業(yè)務(wù)需求,建立如圖6?13所示的外鍵關(guān)系。6.2.4存儲過程和觸發(fā)器

1、存儲過程(1)新書入庫存儲過程該存儲過程接收某種將入庫新書的所有信息作為輸入?yún)?shù),將其無條件插入到入庫表Input中,并查詢Books表中是否已經(jīng)存在該種圖書,若已經(jīng)存在,除了庫存數(shù)量一定要更新,還分別根據(jù)是否提供了圖片文件、圖書摘要、圖書目錄三個參數(shù),決定是否更新圖片文件、圖書摘要、圖書目錄信息;若不存在,則將新書信息插入Books表。6.2.4存儲過程和觸發(fā)器

根據(jù)此流程,編寫新書入庫存儲過程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存儲過程和觸發(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存儲過程和觸發(fā)器

+Convert(varchar,@BookQuantity) --若提供了@BookAbstract參數(shù),則以此為準更新對應(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存儲過程和觸發(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存儲過程和觸發(fā)器

代碼中“--”是T-SQL語言的注釋符號。T-SQL中自定義變量均須以“@”符號開頭。“Convert(varchar,@BookQuantity)”是T-SQL的轉(zhuǎn)換函數(shù),將@BookQuantity變量轉(zhuǎn)換為varchar類型。“exec(@cmdStr)”用于將@cmdStr字符串解釋為T-SQL命令,并執(zhí)行。“scope_identity()”將返回上一個Insert語句所影響的標識列值,此處即Books表中新增圖書的BookID值。6.2.4存儲過程和觸發(fā)器

(2)新建訂單存儲過程由于訂單表Orders的主鍵列OrderID是一個自動增量的標識列,所以,新建訂單操作分為兩個步驟:①在Orders表中插入新記錄,得到新增記錄的OrderID;②使用上述OrderID,在訂單明細表OrderDetails表中插入該訂單所屬的若干購書信息記錄。由于購書信息來自前臺購物車,并且使用前臺C#語言的循環(huán)語句能夠簡化編程,所以,存儲過程中僅包括第①步的功能,T-SQL代碼如下所示:CREATEproc[dbo].[NewOrder]@UserNamenvarchar(256),@Recipientnvarchar(20),@Addressnvarchar(256),6.2.4存儲過程和觸發(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,供插入訂單明細表使用 selectscope_identity()end GO6.2.4存儲過程和觸發(fā)器

6.2.4存儲過程和觸發(fā)器2、觸發(fā)器

對于出庫操作,用訂單表Orders的Update觸發(fā)器,實現(xiàn)Books表中的庫存數(shù)量按訂單明細減少功能。當(dāng)然,有興趣的讀者也可以嘗試改為存儲過程。管理員在訂單處理時的任何修改,以及會員對個人訂單的任何修改,都會運行該觸發(fā)器,因此需要判斷是否正在進行出庫操作:管理員設(shè)置某訂單(由OrderID確定該訂單)的“是否已出庫”O(jiān)utputed字段,將其由false變?yōu)閠rue,bit值為從0變1,即為出庫操作。此時需要在OrderDetails表中查找此OrderID的所有圖書(由BookID確定某圖書)的購書數(shù)量,在Books表中將對應(yīng)BookID圖書的庫存數(shù)量做相應(yīng)減少。6.3數(shù)據(jù)源控件與靜態(tài)查詢

6.3.1數(shù)據(jù)源控件的種類6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢ASP.NET的數(shù)據(jù)源控件現(xiàn)有7種類型,分別用于訪問不同的數(shù)據(jù)來源:SqlDataSourceObjectDataSourceXmlDataSourceSiteMapDataSourceLinqDataSourceEntityDataSource6.3.1數(shù)據(jù)源控件的種類6.3.1數(shù)據(jù)源控件的種類

1、SqlDataSource用于訪問支持SQL標準的數(shù)據(jù)庫,比如MSSQLServer系列,實際上可以訪問ADO.NET支持的所有數(shù)據(jù)源,連接種類包含SqlConnection、OleDbConnection、OracleConnection、OdbcConnection。由于數(shù)據(jù)庫的普及應(yīng)用,SqlDataSource數(shù)據(jù)源是ASP.NET中使用最普遍的數(shù)據(jù)源控件。6.3.1數(shù)據(jù)源控件的種類

2、AccessDataSource用于訪問無用戶名密碼的Access數(shù)據(jù)庫文件,不需提供連接字符串。如果Access數(shù)據(jù)庫文件需要密碼訪問,還是必須使用SqlDataSource。Access是微軟提供的桌面數(shù)據(jù)庫管理系統(tǒng),功能有限。其使用方法和SqlDataSource類似,6.3.1數(shù)據(jù)源控件的種類

3、ObjectDataSource用于訪問對象數(shù)據(jù)源。對象及其來源是非常廣泛的:數(shù)據(jù)表可以對象化為DataTable或數(shù)組等對象,某個文件夾下的所有文件名及其屬性可以對象化為DataTable或數(shù)組等對象,我們可以根據(jù)業(yè)務(wù)邏輯將任意元素都定義為對象。這樣,ObjectDataSource就為我們提供了自由廣泛的業(yè)務(wù)邏輯空間,而同時擺脫了綁定、排序、分頁等一般性的繁瑣處理。6.3.1數(shù)據(jù)源控件的種類4、XmlDataSource用于訪問XML文件,XML(擴展標記語言)已經(jīng)成為重要的跨平臺信息表達、傳輸標準。XML文檔最適合表達可以描述為層次結(jié)構(gòu)的信息,所以,XmlDataSource一般綁定到TreeView、Menu等層次型(樹型)的控件。6.3.1數(shù)據(jù)源控件的種類

5、SiteMapDataSource用于訪問網(wǎng)站根目錄的Web.sitemap文件,綁定到TreeView、Menu等導(dǎo)航控件,而為網(wǎng)站提供站點地圖功能。SiteMapDataSource是XmlDataSource的一個特例,只綁定到特定的Web.sitemap文件,該文件是一個標準的XML文檔,包含了網(wǎng)站中的各級頁面標題、頁面地址等層次信息。6.3.1數(shù)據(jù)源控件的種類

6、LinqDataSource使用LinqDataSource訪問數(shù)據(jù)庫時,需要先建立LINQ對象,然后將其指定給LinqDataSource的屬性。在網(wǎng)站中“添加新項”,添加“LINQtoSQL類”,并進一步建立LINQ對象與數(shù)據(jù)庫表、存儲過程之間的“1:1”映射,數(shù)據(jù)表映射為類,存儲過程映射為方法,觸發(fā)器因不會被前臺調(diào)用而不會被映射。6.3.1數(shù)據(jù)源控件的種類

7、EntityDataSource使用EntityDataSource訪問數(shù)據(jù)庫時,需要先建立實體數(shù)據(jù)模型(EDM),即實體對象,然后將其指定給EntityDataSource的屬性。在網(wǎng)站中“添加新項”,添加“ADO.NETEntityDataModel”,并按照向?qū)崾咀鲞M一步的操作,即可生成相關(guān)的實體對象。6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

SqlDataSource控件不但封裝了ADO.NET無連接訪問數(shù)據(jù)庫的功能,還包含了綁定、排序、分頁的功能。由于ASP.NET的數(shù)據(jù)源控件與頁面數(shù)據(jù)綁定控件結(jié)合非常緊密,共同實現(xiàn)數(shù)據(jù)操作功能,本節(jié)將以GridView數(shù)據(jù)綁定控件為例來說明SqlDataSource數(shù)據(jù)源的使用6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

1、配置SqlDataSource實現(xiàn)無條件查詢例6?1配置SqlDataSource顯示Input表的全部記錄。新建一個Web窗體頁,命名為InputQuery.aspx,在設(shè)計器代碼視圖輸入其title為“入庫單查詢”(或在屬性面板修改Title屬性)。從工具箱“數(shù)據(jù)”選項卡中,拖一個GridView控件到頁面上6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

單擊GridView任務(wù)按鈕,在“選擇數(shù)據(jù)源”下拉框中選擇“<新建數(shù)據(jù)源…>”,出現(xiàn)“數(shù)據(jù)源配置向?qū)А睂υ捒颉?.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

單擊“數(shù)據(jù)庫”圖標,系統(tǒng)將自動生成SqlDataSource類型的數(shù)據(jù)源,修改數(shù)據(jù)源ID為“SqlDataSourceInput”,如圖6?16,單擊“確定”按鈕,出現(xiàn)“配置數(shù)據(jù)源-SqlDataSourceInput”對話框,如圖6?17所示。在圖中下拉列表里已經(jīng)包含了“服務(wù)器資源管理器”中已經(jīng)建立的所有連接和“App_Data”文件夾下的數(shù)據(jù)庫文件的連接,一般情況下,選擇一個即可。單擊“新建連接”按鈕,則可在“添加連接”對話框中,進一步輸入服務(wù)器名和數(shù)據(jù)庫名,創(chuàng)建或附加一個數(shù)據(jù)庫。在已經(jīng)按照6.2.1創(chuàng)建數(shù)據(jù)庫之后,我們在圖6?17中選擇下拉列表中的“bookStore.mdf”即可,單擊“下一步”按鈕,如果是本網(wǎng)站首次使用此數(shù)據(jù)庫,向?qū)⒊霈F(xiàn)圖6?18所示的提示。建議要保存此連接到配置文件中,配置文件即網(wǎng)站根目錄下的web.config文件。如果不保存,整個網(wǎng)站中,每個訪問此數(shù)據(jù)庫的控件都將獨立保存一個連接字符串,假如數(shù)據(jù)庫文件的路徑變了,修改起來比較麻煩。單擊“下一步”,進入向?qū)У摹芭渲肧elect語句”環(huán)節(jié),如圖6?19

如果選擇“指定自定義SQL語句或存儲過程”單選鈕,則進入“定義自定義語句或存儲過程”對話框可以輸入SQL語句(或使用查詢生成器)或者指定已經(jīng)存在的存儲過程。網(wǎng)上書店管理系統(tǒng)Default.aspx頁面中的“SqlDataSourceChangXiaoPaiHang”數(shù)據(jù)源控件,就使用了自定義查詢語句;Managers/BookInput.aspx頁面中的SqlDataSourceBooks數(shù)據(jù)源控件則使用了存儲過程。如果選擇“指定來自表或視圖的列”,可以在下拉列表中選擇某個表或視圖,然后選擇列,并自動生成對應(yīng)的Select語句。“只返回唯一行”將為Select語句添加Distinct關(guān)鍵詞;單擊“WHERE(W)…”按鈕、“ORDERBY(R)…”按鈕將分別出現(xiàn)為Select語句添加Where子句和OrderBy子句的對話框;單擊“高級(V)…”按鈕則可以選擇是否根據(jù)Select語句自動生成Insert、Delete、Update修改語句,以及修改時是否使用“開放式并發(fā)”,選擇“開放式并發(fā)”,將會為Delete、Update語句的Where子句增添包含全部字段的舊值比較邏輯。6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

在本例中,我們選擇“指定來自表或視圖的列”,選擇“Input”表,選擇“*”,即所有列,單擊“下一步”按鈕,進入測試查詢階段,如圖6?20。如果使用了自定義Select語句,為了分析Select語句是否正確,可以單擊“測試查詢”按鈕進行測試,本例中我們單擊“完成”按鈕即可。6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

現(xiàn)在,注意觀察使用向?qū)瓿蓴?shù)據(jù)源控件配置后,InputQuery.aspx頁面標記代碼中,增加了SqlDataSourceInput標記,并已經(jīng)給ConnectionString和SelectCommand屬性賦值,代碼如下:<asp:SqlDataSourceID="SqlDataSourceInput"runat="server"ConnectionString="<%$ConnectionStrings:bookStoreConnectionString%>"SelectCommand="SELECT*FROM[Input]"></asp:SqlDataSource>其中“<%$ConnectionStrings:bookStoreConnection%>”,是一個ASP.NET表達式,ASP.NET表達式在aspx標記代碼中以“<%$”開頭,最常見的用途就是在數(shù)據(jù)源控件中引用配置文件的連接字符串,運行時,將由配置文件中的連接字符串代替此處表示引用配置文件中“ConnectionStrings”節(jié)的name屬性為“bookStoreConnectionString”的連接字符串,此時,我們可以對照觀察圖6?18中保存連接字符串后,web.config文件中添加了以下配置代碼:6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

<connectionStrings><addname="bookStoreConnectionString"connectionString="DataSource=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\bookStore.MDF;IntegratedSecurity=True;UserInstance=True"providerName="System.Data.SqlClient"/></connectionStrings>

最后,右擊頁面InputQuery.aspx,選擇“在瀏覽器中查看”,則可看到如圖6?21的運行結(jié)果,無需編寫任何代碼,就已經(jīng)能夠顯示入庫表中數(shù)據(jù)。6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢2、配置SqlDataSource實現(xiàn)單條件查詢例6?1是把Input表中的所有記錄都顯示在了頁面中,而實際應(yīng)用中一般都是按照用戶輸入的條件來查詢,這當(dāng)然需要有條件值的來源,比如頁面上的一個文本框,用戶在文本框的輸入將用作查詢參數(shù),即SqlDataSource的SelectParameters屬性。在“列”下列列表中列出了Input表的所有字段,選擇“BookID”;“運算符”選擇“=”;“源”下拉列表中列出了查詢參數(shù)的可能來源,簡單介紹如下:None:參數(shù)不是根據(jù)某個來源動態(tài)設(shè)置的,必須在“參數(shù)屬性”部分輸入常量值。Control:參數(shù)來自于頁面控件,必須在“參數(shù)屬性”部分選擇當(dāng)前頁面已有的控件ID,也可輸入默認值,以免發(fā)生異常,默認值是在用戶還沒有在控件中輸入值時的查詢參數(shù)。Cookie:參數(shù)來源于客戶端請求中所包含的一個Cookie。Form:參數(shù)來源于Form字段。Profile:參數(shù)來源于用戶的配置文件。用戶配置文件默認存儲于ASP.NET角色和成員資格數(shù)據(jù)庫中,類似于存儲于數(shù)據(jù)庫的Session,但其屬性對象是強類型的。QueryString:參數(shù)來源于客戶端請求URL中包含的一個查詢字符串。Session:參數(shù)來源于Session變量。6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢

現(xiàn)在,注意觀察完成where子句配置后,InputQuery.aspx頁面代碼中SqlDataSourceInput的標記代碼如下:<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ù)源控件實現(xiàn)靜態(tài)查詢

6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢3、配置SqlDataSource實現(xiàn)多條件查詢有時我們需要多條件查詢,條件中的運算符也不一定是“等于”,比如:查詢進貨數(shù)量“超過”1000或者進價“高于”10元的入庫記錄。這樣的查詢實際上是在查詢語句的where子句中包含多個條件。實現(xiàn)多條件查詢,也可以僅用向?qū)瓿蒘qlDataSource的配置,而無需編寫代碼。除了使用SqlDataSource控件的任務(wù)按鈕啟動“數(shù)據(jù)源配置向?qū)А?,通過SqlDataSource控件的“SelectQuery”屬性,還可以使用“命令和參數(shù)編輯器”向?qū)В矊儆跀?shù)據(jù)源配置向?qū)У囊环N,供開發(fā)者更自由地設(shè)置查詢條件。在InputQuery.aspx頁面設(shè)計視圖中,依次做如下操作:選中已有靜態(tài)文本、TextBoxBookID控件,敲Delete鍵刪除;重新輸入靜態(tài)文本:“查詢進貨數(shù)量多于”;拖入TextBox控件,ID設(shè)為“TextBoxInputQuantity”;輸入靜態(tài)文本:“或者進價高于”;拖入TextBox控件,ID設(shè)為“TextBoxInputPrice”;輸入靜態(tài)文本:“的入庫記錄”;此處不使用“SqlDataSourceInput”控件任務(wù)按鈕啟動配置數(shù)據(jù)源向?qū)?。選中“SqlDataSourceInput”控件,在屬性面板中,單擊“SelectQuery”屬性后的按鈕,啟動“命令和參數(shù)編輯器”向?qū)?,如圖6?25;單擊“查詢生成器”按鈕,出現(xiàn)“查詢生成器”對話框

6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢在“查詢生成器”第二窗格中編輯,刪除“BookID”列的篩選器,輸入“InputPrice”列的篩選器為“>@price”,再輸入“InputQuantity”列的“或”篩選器為“>@quantity”,此處的“price”和“quantity”是自定義的變量名,編輯完畢,單擊“執(zhí)行查詢”單擊“查詢生成器”的“確定”按鈕,返回如圖6?25的“命令和參數(shù)編輯器”,應(yīng)注意到Select命令已經(jīng)變化了,當(dāng)然,也可以在“命令和參數(shù)編輯器”中手工輸入Select命令語句,而不使用“查詢生成器”;在“命令和參數(shù)編輯器”中,選中參數(shù)“BookID”,單擊按鈕,然后單擊“刷新參數(shù)”按鈕;選中“price”參數(shù),選擇“Control”參數(shù)源,選擇ControlID為“TextBoxInputPrice”,選擇后,參數(shù)值自動變?yōu)椤癟extBoxInputPrice.Text”,這是應(yīng)為Text是文本框的缺省屬性,如果所選控件的缺省屬性不是所需要的參數(shù)來源,可以單擊“顯示高級屬性”鏈接,進一步選擇所選控件的哪個屬性作為參數(shù)來源;類似地設(shè)置“quantity”的參數(shù)源,設(shè)置完畢后單擊“確定”按鈕。6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢在InputQuery.aspx頁面設(shè)計視圖中,依次做如下操作:選中已有靜態(tài)文本、文本框控件,敲Delete鍵刪除;重新輸入靜態(tài)文本:“請輸入要查詢的起始入庫日期:”;拖入TextBox控件,ID設(shè)為“TextBoxInputTimeStart”;拖入ImageButton控件,ID設(shè)為“ImageButtonShowHideCalendarStart”;拖入Calendar控件,ID設(shè)為“CalendarStart”,Visible設(shè)為false,使用任務(wù)按鈕自動套用格式,選擇“彩色型1”,如圖6?31;回車;輸入靜態(tài)文本:“請輸入要查詢的終止入庫日期:”;拖入TextBox控件,ID設(shè)為“TextBoxInputTimeEnd”;拖入ImageButton控件,ID設(shè)為“ImageButtonShowHideCalendarEnd”;拖入Calendar控件,ID設(shè)為“CalendarEnd”,Visible設(shè)為false,使用任務(wù)按鈕自動套用格式,選擇“彩色型2”,以與CalendarStart控件區(qū)別顯示;回車6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢使用與上例相似的步驟,通過“SqlDataSourceInput”控件的“SelectQuery”可視屬性,使用“命令和參數(shù)編輯器”,修改其命令和參數(shù)單擊“確定”,完成SqlDataSourceInput的配置。雙擊“ImageButtonShowHideCalendarStart”按鈕,在InputQuery.aspx.cs代碼編輯器中編寫其Click事件委托函數(shù)如下:protectedvoidImageButtonShowHideCalendarStart_Click(objectsender,ImageClickEventArgse){CalendarStart.Visible=!CalendarStart.Visible;}代碼中只有一個賦值語句,將“CalendarStart”控件的Visble屬性置為原來的相反值,即若原來日歷控件隱藏,單擊此圖片按鈕后就顯示;若原來是顯示的,單擊后就隱藏。6.3.2使用SqlDataSource數(shù)據(jù)源控件實現(xiàn)靜態(tài)查詢雙擊“CalendarStart”控件,在代碼編輯器中編寫其SelectionChanged事件委托函數(shù)如下:protectedvoidCalendarStart_SelectionChanged(objectsender,EventArgse){TextBoxInputTimeStart.Text=CalendarStart.SelectedDate.ToShortDateString();CalendarStart.Visible=false;}這段代碼將在用戶選擇了日歷控件的一個日期后,回發(fā)并執(zhí)行。代碼中有兩個賦值語句,第一句完成將用戶在日歷控件中選擇的日期轉(zhuǎn)換為T-SQL可識別的日期文本,并填入“TextBoxInputTimeStart”文本框的功能;第二句完成隱藏日歷控件的功能。對終止日期的“ImageButtonShowHideCalendarEnd”按鈕和“CalendarEnd”控件,做上述類似的操作,相關(guān)代碼如下:protectedvoidImageButtonShowHideCalendarEnd_Click(objectsender,ImageClickEventArgse){CalendarEnd.Visible=!CalendarEnd.Visible;}protectedvoidCalendarEnd_SelectionChanged(objectsender,EventArgse){TextBoxInputTimeEnd.Text=CalendarEnd.SelectedDate.ToShortDateString();CalendarEnd.Visible=false;}在瀏覽器中查看頁面,通過單擊圖片按鈕,顯示日歷控件,單擊日歷控件中的一個日期,自動填入查詢參數(shù),最后單擊“提交”按鈕查看查詢結(jié)果。本例編寫了一點程序,只是為了方便用戶使用,并沒有為配置查詢而編寫程序。6.4基本知識2:常用數(shù)據(jù)綁定控件及基本數(shù)據(jù)操作

6.4.1DropDownList等列表類綁定控件及列表條件查詢6.4.2GridView控件及主從表顯示6.4.3DetailsView控件及單條數(shù)據(jù)修改6.4.4FormView控件及單條數(shù)據(jù)修改的靈活布局6.4.5DataList控件及數(shù)據(jù)顯示的靈活布局6.4.1DropDownList等列表類綁定控件及列表條件查詢

DropDownList控件的列表項可以直接在Items集合屬性中指定;也可以做數(shù)據(jù)綁定,從數(shù)據(jù)庫中獲取列表項。每個列表項是一個ListItem類對象,ListItem包含以下主要屬性:Text屬性:列表項的顯示文本;Value屬性:列表項的值,一般是顯示文本對應(yīng)的某種編碼,也可以與Text相同。DropDownList做數(shù)據(jù)綁定時,需要設(shè)置以下屬性:用DataSourceID屬性指定數(shù)據(jù)源;DataTextField屬性指定列表項的Text屬性;DataValueField屬性指定列表項的Value屬性。6.4.2GridView控件及主從表顯示

GridView控件以表格形式顯示數(shù)據(jù)源的數(shù)據(jù),其結(jié)構(gòu)由列(Columns)決定,每數(shù)據(jù)列對應(yīng)一個字段(Field),而每數(shù)據(jù)行對應(yīng)一條記錄。GridView控件是功能強大的數(shù)據(jù)綁定控件,僅僅配置其基本屬性就可以套用格式、實現(xiàn)分頁/排序/選擇/編輯/刪除等功能;還可以詳細配置每列的屬性;而作為一種模板化的復(fù)合控件,除了數(shù)據(jù)行,還有標題行、腳注行、頁導(dǎo)航行等,每種行的每列都可以作為普通控件的容器使用;GridView控件還提供了多種事件,供開發(fā)人員編寫程序,靈活控制控件的顯示和行為。6.4.2GridView控件及主從表顯示1、基本配置自動套用格式為了美化顯示,ASP.NET為GridView預(yù)定義了多種顯示樣式,使用GridView控件的任務(wù)按鈕,單擊首項“自動套用格式…”,即可在出現(xiàn)的對話框中選擇一種預(yù)定義的顯示樣式,如圖6?40所示。選擇“移除格式設(shè)置”即為不使用預(yù)定義格式。6.4.2GridView控件及主從表顯示分頁分頁功能,是為了解決由于客戶端一次顯示全部數(shù)據(jù),而可能會造成的網(wǎng)絡(luò)擁塞、響應(yīng)遲緩問題。在數(shù)據(jù)源控件的支持下,對GridView分頁非常簡單,只需要在GridView控件的任務(wù)按鈕中選中“啟用分頁”即可?!癙ageSize”屬性用于設(shè)置每頁的數(shù)據(jù)行數(shù),如果需要改變默認的分頁風(fēng)格,可以進一步設(shè)置GridView控件的“PagerSettings”、“PagerStyle”屬性。排序單擊列標題鏈接按鈕,使數(shù)據(jù)表按照本列進行升、降序排列,實現(xiàn)這一功能,也只需在任務(wù)按鈕中選中“啟用排序”。選定在任務(wù)按鈕中選中“啟用選定內(nèi)容”后,GridView中每個數(shù)據(jù)行會多出一列,其中包含一個“選擇”鏈接按鈕,在瀏覽器中查看頁面時,單擊“選擇”,就會選中該行,可以設(shè)置“SelectedRowStyle”屬性以使選中行突出顯示6.4.2GridView控件及主從表顯示某行被選中后,GridView控件的一些屬性值還會自動發(fā)生以下變化:SelectedIndex置為選中數(shù)據(jù)行的索引;SelectedRow為GirdView控件的選中行,選中行的狀態(tài)為“Selected”(而不是Normal);SelectedDataKey為選中數(shù)據(jù)行的主鍵值(GridView的DataKeyNames屬性設(shè)置了所綁定數(shù)據(jù)表的主鍵字段名稱。若是組合主鍵,各字段名間以逗號分隔,此時SelectedDataKey是可索引的);SelectedValue為選中數(shù)據(jù)行的第一個主鍵字段值,即SelectedValue等于SelectedDataKey[0]。利用上述特性,我們可以進行主從表同步綁定顯示。6.4.2GridView控件及主從表顯示數(shù)據(jù)綁定控件在功能上與數(shù)據(jù)源控件緊密結(jié)合。如果數(shù)據(jù)源控件配置了UpdateCommand和DeleteCommand屬性,GridView控件還可以啟用編輯和刪除功能。即使數(shù)據(jù)源控件配置了InsertCommand屬性,GridView控件也不具備插入功能。跟“啟用選定內(nèi)容”類似,啟用了編輯、刪除后,將在每個數(shù)據(jù)行都添加“編輯”、“刪除”鏈接按鈕,即GridView控件的數(shù)據(jù)交互是按照“行”進行管理的。6.4.2GridView控件及主從表顯示6.4.2GridView控件及主從表顯示2、分列詳細設(shè)置及友好顯示前面例子中,數(shù)據(jù)表的顯示很有很多不足,比如:列標題是否可以顯示為漢字?時間列是否可以顯示為“年月日”的形式顯示?“選擇”列可否顯示為“明細”?可否將“編輯”列放在表格中的最右側(cè)?這些問題,都可以通過單擊任務(wù)按鈕的“編輯列…”,在“字段”對話框中進行詳細設(shè)置來解決。對列做的改動,將會影響標題行、所有數(shù)據(jù)行、尾行等。對話框由以下主要組成部分:“可用字段”列表,列出了可能添加到GridView控件中的全部字段,單擊“添加”按鈕,即可加入到“選定的字段”列表,包括:“所有字段”:選定所有可能字段;“BoundField”:包括數(shù)據(jù)源控件提供的所有可綁定字段,如果未顯示任何字段,單擊此對話框左下方“刷新架構(gòu)”鏈接即可;“CheckedBoxField”:包括數(shù)據(jù)源控件提供的布爾型(bit型)字段,將顯示為CheckedBox控件,如果數(shù)據(jù)源未提供此類型字段,則可將一個暫未綁定的CheckBox控件列添加到選定列表,但可以在此對話框的“屬性”部分完成綁定;6.4.2GridView控件及主從表顯示“HyperLinkField”:選定一個暫未綁定的HyperLink控件列;“ImageField”:選定一個暫未綁定的Image控件列;“ButtonField”:選定一個暫未綁定的按鈕控件列,默認為“LinkButton”類按鈕,但可以在此對話框的“屬性”部分修改為“Button”或“ImageButton”類按鈕;“CommandField”:包含數(shù)據(jù)綁定控件(包括GridView)內(nèi)置的命令按鈕,所謂內(nèi)置,是指數(shù)據(jù)綁定控件自動識別它們并執(zhí)行特定的命令;“TemplateField”:選定一個功能強大的模板列,也可以選中一個選定的字段后,單擊此對話框右下方“將此字段轉(zhuǎn)換為TemplateField”,來得到一個模板列,隨后將詳細探討模板列。

6.4.2GridView控件及主從表顯示“選定的字段”列表,列出了從“可用字段”中添加的字段標題,這些列將顯示在GridView中。選中其中之一(除了模板列),將在此對話框的“屬性”區(qū)域顯示該列的屬性。右側(cè)三個按鈕可調(diào)整顯示順序(最上的在GridView最左側(cè)顯示)和取消選定?!白詣由勺侄巍睆?fù)選框,選中時,表示不在此對話框中選定列,而是順序顯示數(shù)據(jù)源控件提供的所有可綁定字段,此時“選定的列”列表如果不為空,將可能有重復(fù)的列?!皩傩浴眳^(qū)域,供查看和修改“選定的列”中選中列的屬性。隨后將按照需求詳細探討。目前,“選定的列”列表中,依次已有:選擇CommandField、各個BoundField。6.4.2GridView控件及主從表顯示分析:要使訂單詳細表顯示更友好,應(yīng)該修改“SqlDataSourceOrderDetails”控件的SelectCommand,從圖書信息表Books中選取相關(guān)的圖書信息:圖書名稱、作者、原價、折扣、數(shù)量、金額等,其中“金額”在圖書信息表中并不存在,是一個計算列。這些修改可以用“命令和參數(shù)編輯器”生成。要使訂單表中顯示送貨方式名稱,需要修改“SqlDataSourceOrders”控件的SelectCommand,進行多表查詢,從Orders表中獲得訂單信息的同時,從SendModes表中獲取每個SendModeID對應(yīng)的名稱;6.4.2GridView控件及主從表顯示訂單表的Update和Delete的邏輯要求:對于前臺個人訂單頁面,只允許個人修改“收件人”、“地址”、“郵編”、“電話”、“送貨方式”、“付款方式”信息;而刪除操作時,由于表間約束,必須先刪除訂單詳細表OrderDetails中對應(yīng)OrderID的所有記錄,才可刪除訂單表中的此OrderID的記錄。訂單詳細表的Update和Delete操作邏輯要求:只允許修改“購買數(shù)量”,其他無特殊要求。要啟用修改和刪除,必須先配置數(shù)據(jù)源控件的UpdateCommand和InsertCommand屬性,由于本例中修改和刪除操作的特殊要求,不宜單擊類似圖6?19中的“高級…”按鈕來自動生成默認的Update和Delete命令,用類似圖6?25的“命令和參數(shù)編輯器”生成更合適,但訂單表的刪除操作包含兩個Delete命令,需要手工輸入。6.4.2GridView控件及主從表顯示查看aspx頁面標記代碼,可發(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ù)綁定等控件的一種強大功能,GridView控件的普通列只可以包含一個子控件用來顯示或編輯字段,模板列可以包含各種HTML標記和服務(wù)器控件,并能夠像對網(wǎng)頁布局那樣進行子控件的布局,還可以創(chuàng)建獨立于父控件的子控件事件委托函數(shù)。數(shù)據(jù)綁定控件的模板技術(shù)使得子控件不但可以自動重復(fù)綁定數(shù)據(jù),而且可以自由布局和定制行為,不同的狀態(tài)下(如顯示狀態(tài)、編輯狀態(tài))還可以包含不同的子控件。ASP.NET包含若干模板化的控件,模板不是GridView控件獨有的技術(shù)。分類列模板:模板在GridView控件中是按列定義的,即定義一個模板列,則GridView控件所有數(shù)據(jù)行的此單元格,都將具備此列模板定義的外觀和行為,也就是數(shù)據(jù)是在某列按行重復(fù)綁定的,行變列不變。行模板:行模板用來控制數(shù)據(jù)綁定控件的整體外觀和行為,如GridView、DetailsView、FormView等控件都支持按行定義的“PagerTemplate”(頁導(dǎo)航行模板),還支持“EmptyDataTemplate”(綁定數(shù)據(jù)為空時的模板)等。狀態(tài)模板:每個模板可能處于多種交互狀態(tài),如GridView是按行管理數(shù)據(jù)交互的,也就是數(shù)據(jù)狀態(tài)按行變化,包括標題行、正常顯示行、交替行顯示行(偶數(shù)行)、編輯行、腳注行,對應(yīng)的模板為“ItemTemplate”、“AlternatingItemTemplate”、“EditTemplate”、“HeaderTemplate”、“FooterTemplate”,GridView的每個模板列都可能有這些狀態(tài)6.4.2GridView控件及主從表顯示應(yīng)用在希望自由布局并數(shù)據(jù)綁定的場合,都可以使用數(shù)據(jù)綁定控件的模板。下面我們用模板列來解決例6?10中編輯行的問題。6.4.2GridView控件及主從表顯示6.4.2GridView控件及主從表顯示4、GridView事件編程概念如前所述,GridView控件的數(shù)據(jù)交互是按行進行的,其事件也是按行被觸發(fā)的。我們用到的事件有:RowCreated、RowDataBound、RowCommand等,其中RowCreated在創(chuàng)建行后發(fā)生,RowDataBound在行數(shù)據(jù)綁定后發(fā)生,RowCommand則響應(yīng)行中的按鈕單擊事件。還有RowDeleting、RowDeleted、RowUpdating、RowUpdated等事件,分別對應(yīng)數(shù)據(jù)行刪除前、刪除后、更新前、更新后等時機。ASP.NET是基于事件的編程,靈活使用事件非常重要,事件處理的順序與控件生命周期密切相關(guān)??丶纳芷诒3峙c頁面保持同步。應(yīng)用使用RowCreated、RowDataBound事件時,要注意除了數(shù)據(jù)行外,標題行、腳注行也會引發(fā)此類事件。另外,每行各列中的子控件在Page對象中是不可見的,必須用Controls集合索引或FindControl方法來訪問這些控件。處理GridView行的RowCommand事件時,有以下規(guī)則:GridView某行中的多個按鈕,用按鈕的CommandName屬性區(qū)分。此外,GridView是按列設(shè)計呈現(xiàn)的,每個行都具有相同CommandName的按鈕,再用按鈕的CommandArgument屬性存儲所處的行索引,以區(qū)分行。6.4.2GridView控件及主從表顯示GridView控件提供了選擇、排序、分頁、編輯、更新、取消、刪除等內(nèi)置功能,為按鈕指定特定的CommandName就可以調(diào)用這些功能,會自動給CommandArgument屬性賦值、自動執(zhí)行內(nèi)置功能,如果僅需實現(xiàn)內(nèi)置功能,就不必再編寫事件代碼。上述內(nèi)置功能的CommandName分別是:“Select”、“Sort”、“Page”、“Edit”、“Update”、“Cancel”、“Delete”。其他數(shù)據(jù)綁定控件還提供“Insert”、“New”命令。按鈕一般置于CommandField列、ButtonField列或模板列,模板列的按鈕可以有獨立的事件委托函數(shù),而不觸發(fā)RowCommand事件。模板列中自定義功能(非內(nèi)置功能)的按鈕,不會自動給CommandArgument屬性賦值,可以在RowCreated或RowDataBound事件中訪問該按鈕,給其CommandArgument屬性賦自定義的值。我們僅舉例完成前面例子設(shè)計的OrderInfo.aspx頁面中,刪除提示和訂單詳細表中金額合計的功能。6.4.2GridView控件及主從表顯示6.4.3etailsView控件及單條數(shù)據(jù)修改

GridView控件功能強大,但沒有內(nèi)置的插入新增記錄功能,ASP.NET中最方便的可插入新增記錄控件是DetailsView。DetailsView控件與GridView控件外觀和功能上都很相似:以表格形式顯示數(shù)據(jù),內(nèi)置了綁定、分頁、插入、編輯、刪除功能,支持模板功能,但每頁只顯示一條記錄,每行(Row)顯示一個字段(Field)。DetailsView控件的模式對應(yīng)數(shù)據(jù)交互的狀態(tài)。DetailsViewMode枚舉類型的屬性DefaultMode代表DetailsView控件的默認模式,屬性CurrentMode則代表當(dāng)前模式,如“DetailsViewOrder.CurrentMode”值為“DetailsViewMode.Insert”表示“DetailsViewOrder”控件正處在插入新增記錄狀態(tài)。通過操作,我們發(fā)現(xiàn):本例可以對類別進行增、刪、改操作,但由于無法直觀看到所有的類別數(shù)據(jù),操作起來很盲目;由于類別數(shù)據(jù)是樹形層級結(jié)構(gòu)的,一般情況下,只存在葉子類別的圖書,也就是父類別并不受外鍵關(guān)系的約束,因此無法在數(shù)據(jù)庫管理系統(tǒng)中被保護,這樣,使用本頁面進行類別管理就可能出現(xiàn)葉子類不可刪除,但其父類已經(jīng)被誤刪的情況。要解決第一個問題,可以為網(wǎng)頁添加一個GridView控件,查看所有類別數(shù)據(jù),但這種方法不能直觀顯示類別間的層級關(guān)系,我們使用一個自定義的“UC_CategoryTree”用戶控件代替GridView;要解決第二個問題,需要進行事件編程,在把Delete命令提交給SQLServer之前,判斷當(dāng)前類別及其所有子類(下稱“類別家族”)是否包含圖書,僅對空類別家族(不包含圖書)提交刪除命令。6.4.3etailsView控件及單條數(shù)據(jù)修改

結(jié)合界面設(shè)計,分析動作流程可知,需編程解決以下問題:根據(jù)管理員選中的節(jié)點,給“LabelSelectedCategoryId”控件賦值;若要新建類別為當(dāng)前類別的子類別,應(yīng)將當(dāng)前類別ID填入新類別的“父ID”字段;按照當(dāng)前節(jié)點對應(yīng)的類別家族,判斷其是否包含圖書信息;調(diào)用“SqlDataSourceCategorys”的功能刪除當(dāng)前類別;通過客戶端腳本給管理員提示框。進行以上編程需要調(diào)用App_Code文件夾中的Db類,以及類別樹控件的功能

6.4.3etailsView控件及單條數(shù)據(jù)修改

屬性:CurrentNode:只讀,表示管理員選中的節(jié)點,TreeNode類型,其Text、Value、ToolTip子屬性,分別對應(yīng)CategoryName、CategoryID、CategoryDescription數(shù)據(jù);事件:SelectedNodeChanged:管理員改變對節(jié)點的選擇時發(fā)生,是EventHandler類型,只需object和EventArgs類型的兩個參數(shù);方法:RefreshCategoryTree:使類別樹與數(shù)據(jù)庫同步,并選中、展開指定CategoryID值的類別節(jié)點,無返回值,形參preSelectedNodeValue是字符串類型,表示TreeNode類型的Value,包含指定的CategoryID值,若為null,則選中、展開根節(jié)點;SetCurrentNodeByValue:僅選中、展開指定類別節(jié)點,參數(shù)與RefreshCategoryTree方法相同。6.4.3etailsView控件及單條數(shù)據(jù)修改

在CategorysManage.aspx.cs中,編寫Page_Load事件委托函數(shù)代碼如下:protectedvoidPage_Load(objectsender,EventArgse){UC_CategoryTree1.SelectedNodeChanged+=newEventHandler(UC_CategoryTree1_SelectedNodeChanged);}6.4.3etailsView控件及單條數(shù)據(jù)修改

在輸入上述代碼時,輸入完“+=”后連續(xù)按兩次“Tab”鍵,代碼助手即自動建立類別樹控件的SelectedNodeChanged事件委托函數(shù)聲明,再以賦值語句替換自動生成的“throw”語句,以實現(xiàn)在管理員選擇不同的節(jié)點時,用Label控件得到所選類別ID,代碼如下:voidUC_CategoryTree1_SelectedNodeChanged(objectsender,EventArgse){LabelSelectedCategoryId.Text=UC_CategoryTree1.CurrentNode.Value;}6.4.3etailsView控件及單條數(shù)據(jù)修改

為協(xié)助管理員建立當(dāng)前類別的子類別,編寫“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)置的刪除動作。ClientScript.RegisterStartupScript(typeof(Page),“DeleteError”,“alert(‘不能刪除此類別,因為存在此類別的圖書’);”,true);//注冊頁面的啟動腳本,在瀏覽器彈出對話框。}}6.4.3etailsView控件及單條數(shù)據(jù)修改

6.4.4FormView控件及單條數(shù)據(jù)修改的靈活布局

FormView控件和DetailsView控件很相似,每頁只顯示一條記錄,默認情況下每行(Row)顯示一個字段(Field),F(xiàn)ormView控件和DetailsView控件的區(qū)別在于FormView允許自定義布局,其每個模式(Mode),都有對應(yīng)的模板,比如,我們在修改圖書信息時,希望“圖書圖片在左面顯示,右面每行顯示兩個字段……”,要實現(xiàn)類似這樣的要求,同時還要使用數(shù)據(jù)綁定的功能,這就需要使用FormView控件,編輯其EditItemTemplate模板來實現(xiàn)。用戶控件“UC_UploadImageFile”是一個增強的FileUpload控件,適合處理需將路徑存儲到數(shù)據(jù)庫的圖像文件,其公開成員包括:屬性:AllowNull:獲取或設(shè)置是否允許不上傳文件,為false值而用戶未選擇客戶端文件時,將填寫錯誤信息;AllowedFileTypesFilter:允許上傳的文件類型,以“|”分隔的帶點文件擴展名字符串;方法:UploadImgFile方法:執(zhí)行檢查文件類型,按照指定的文件名保存文件,得到編碼的虛擬根路徑,以及錯誤信息,返回是否上傳成功。參數(shù)serverVirtualRootFileNameWithoutExtension是指定的文件名,不含擴展名的虛擬根路徑,如“~/BookPics/C#_李正吉”;引用參數(shù)serverVirtualRootFileNameForDb是編碼過的含擴展名文件名,如“~/BookPics/C%23_%e6%9d%8e%e6%ad%a3%e5%90%89.jpg”,編碼的原因為“#”等字符是Url保留字符,將導(dǎo)致圖書信息顯示頁面中無法顯示圖片,若沒有上傳文件且AllowNull為true,該參數(shù)保持原值;輸出參數(shù)errorMsg包含了錯誤字符串。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;}注意類別樹控件的類型名為“UserControls_UC_CategoryTree”,其中“UserControls_”是在“UserControls”文件夾下建立用戶控件類的默認前綴。6.4.3etailsView控件及單條數(shù)據(jù)修改

類別樹控件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;}由于事件是類別樹控件發(fā)出的,所以類別樹控件可以由參數(shù)sender直接轉(zhuǎn)換得到,而“TextBoxCategoryID”文本框是和類別樹控件同屬一個容器的子控件,所以,在類別樹控件的Parent控件中可以找到類別文本框,將類別樹控件中當(dāng)前節(jié)點的Value(即類別ID)填入文本框后,隱藏類別樹控件。6.4.3etailsView控件及單條數(shù)據(jù)修改

“ImageButtonShowCategoryTree”按鈕用于顯示/隱藏類別樹控件,其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)用類別樹控件的SetCurrentNodeByValue方法選中、展開當(dāng)前類別對應(yīng)的節(jié)點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控件,允許自定義各種模板,但僅僅自動生成ItemTemplate模板,并且需要自己編程實現(xiàn)排序、分頁、編輯、刪除功能。適合開發(fā)人員希望得到更多布局靈活性,而不是數(shù)據(jù)操作方便性的場合。DataList控件能夠通過屬性控制布局樣式,比如表格式布局或者流式布局(即依次排列),并且可以設(shè)置水平方向或垂直方向重復(fù)顯示多少條記錄,網(wǎng)上書店管理系統(tǒng)的首頁使用DataList控件顯示圖書的概要信息,設(shè)置為水平方向重復(fù)3列。DataList控件也提供了設(shè)置這些布局屬性的專用界面,如圖6?71,單擊任務(wù)按鈕中的“屬性生成器…”鏈接或?qū)傩悦姘逯械陌粹o,都會打開一個用來設(shè)置布局的屬性對話框。使用DataList控件顯示新上架圖書的概要信息。新建“Default.aspx”頁面,插入3行1列的布局表格,第一行單元格放入Literal控件“LiteralTitle”第二行放入水平分隔線,第三行拖入DataList控件,設(shè)置其屬性EnableViewState為“False”,以減少客戶端和服務(wù)器端的數(shù)據(jù)往返,Width屬性為“100%”,RepeatDirection屬性為“Horizontal”,RepeatColumns屬性為“3”,CellSpacing屬性為“10”,再為其新建數(shù)據(jù)庫數(shù)據(jù)源“SqlDataSourceSearchBooks”,與前例使用相同的數(shù)據(jù)庫連接,配置SelectCommand為以下SQL語句:"selecttop6BookID,BookImage,BookName,BookPublisher,BookPublishDate,BookAuthor,BookPrice,BookDiscountfromBooksorderbyBookAddTimedesc"6.4.3etailsView控件及單條數(shù)據(jù)修改

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

評論

0/150

提交評論