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

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

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

6.6決策與計劃

6.7實施

6.8檢查與評價6.1學習情境引入

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

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

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

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

6.2.1創(chuàng)建數據庫的操作6.2.2業(yè)務數據表6.2.3數據表間關系

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

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

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

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

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

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

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

6.2.2業(yè)務數據表

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

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

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

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

5、送貨方式表為規(guī)范管理送貨方式信息,防止用戶輸入混亂,專門建立了送貨方式表,命名為SendModes,如圖6?9。6.2.2業(yè)務數據表

6、付款方式表與送貨方式類似,建立了付款方式表,命名為PayModes,圖6?10示出了該表結構。6.2.2業(yè)務數據表

7、訂單表用戶的訂單信息,保存在Orders表中,其結構如圖6?11所示。訂單表中并不保存訂購的圖書信息。6.2.2業(yè)務數據表

8、訂單詳細表每個訂單中訂購的圖書詳細信息,保存在表OrderDetails中,其結構如圖6?126.2.3數據表間關系

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

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

根據此流程,編寫新書入庫存儲過程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表中已經存在,只更新數量,另判斷圖片文件、摘要、目錄是否需要更新

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參數,則以此為準更新對應字段 --若此參數為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的轉換函數,將@BookQuantity變量轉換為varchar類型?!癳xec(@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表中的庫存數量按訂單明細減少功能。當然,有興趣的讀者也可以嘗試改為存儲過程。管理員在訂單處理時的任何修改,以及會員對個人訂單的任何修改,都會運行該觸發(fā)器,因此需要判斷是否正在進行出庫操作:管理員設置某訂單(由OrderID確定該訂單)的“是否已出庫”O(jiān)utputed字段,將其由false變?yōu)閠rue,bit值為從0變1,即為出庫操作。此時需要在OrderDetails表中查找此OrderID的所有圖書(由BookID確定某圖書)的購書數量,在Books表中將對應BookID圖書的庫存數量做相應減少。6.3數據源控件與靜態(tài)查詢

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

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

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

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

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

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

7、EntityDataSource使用EntityDataSource訪問數據庫時,需要先建立實體數據模型(EDM),即實體對象,然后將其指定給EntityDataSource的屬性。在網站中“添加新項”,添加“ADO.NETEntityDataModel”,并按照向導提示做進一步的操作,即可生成相關的實體對象。6.3.2使用SqlDataSource數據源控件實現(xiàn)靜態(tài)查詢

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

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

單擊GridView任務按鈕,在“選擇數據源”下拉框中選擇“<新建數據源…>”,出現(xiàn)“數據源配置向導”對話框。6.3.2使用SqlDataSource數據源控件實現(xiàn)靜態(tài)查詢

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

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

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

現(xiàn)在,注意觀察使用向導完成數據源控件配置后,InputQuery.aspx頁面標記代碼中,增加了SqlDataSourceInput標記,并已經給ConnectionString和SelectCommand屬性賦值,代碼如下:<asp:SqlDataSourceID="SqlDataSourceInput"runat="server"ConnectionString="<%$ConnectionStrings:bookStoreConnectionString%>"SelectCommand="SELECT*FROM[Input]"></asp:SqlDataSource>其中“<%$ConnectionStrings:bookStoreConnection%>”,是一個ASP.NET表達式,ASP.NET表達式在aspx標記代碼中以“<%$”開頭,最常見的用途就是在數據源控件中引用配置文件的連接字符串,運行時,將由配置文件中的連接字符串代替此處表示引用配置文件中“ConnectionStrings”節(jié)的name屬性為“bookStoreConnectionString”的連接字符串,此時,我們可以對照觀察圖6?18中保存連接字符串后,web.config文件中添加了以下配置代碼:6.3.2使用SqlDataSource數據源控件實現(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的運行結果,無需編寫任何代碼,就已經能夠顯示入庫表中數據。6.3.2使用SqlDataSource數據源控件實現(xiàn)靜態(tài)查詢2、配置SqlDataSource實現(xiàn)單條件查詢例6?1是把Input表中的所有記錄都顯示在了頁面中,而實際應用中一般都是按照用戶輸入的條件來查詢,這當然需要有條件值的來源,比如頁面上的一個文本框,用戶在文本框的輸入將用作查詢參數,即SqlDataSource的SelectParameters屬性。在“列”下列列表中列出了Input表的所有字段,選擇“BookID”;“運算符”選擇“=”;“源”下拉列表中列出了查詢參數的可能來源,簡單介紹如下:None:參數不是根據某個來源動態(tài)設置的,必須在“參數屬性”部分輸入常量值。Control:參數來自于頁面控件,必須在“參數屬性”部分選擇當前頁面已有的控件ID,也可輸入默認值,以免發(fā)生異常,默認值是在用戶還沒有在控件中輸入值時的查詢參數。Cookie:參數來源于客戶端請求中所包含的一個Cookie。Form:參數來源于Form字段。Profile:參數來源于用戶的配置文件。用戶配置文件默認存儲于ASP.NET角色和成員資格數據庫中,類似于存儲于數據庫的Session,但其屬性對象是強類型的。QueryString:參數來源于客戶端請求URL中包含的一個查詢字符串。Session:參數來源于Session變量。6.3.2使用SqlDataSource數據源控件實現(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數據源控件實現(xiàn)靜態(tài)查詢

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

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

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

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

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

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

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

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

6.4.3etailsView控件及單條數據修改

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

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

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

為協(xié)助管理員建立當前類別的子類別,編寫“DetailsViewCategory”控件的DataBound事件委托函數如下: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控件及單條數據修改

刪除功能,ItemDeleting事件委托函數如下:protectedvoidDetailsViewCategory_ItemDeleting(objectsender,DetailsViewDeleteEventArgse){if(!Db.CanDeleteCategory(UC_CategoryTree1.CurrentNode))//若不允許刪除{e.Cancel=true;//取消內置的刪除動作。ClientScript.RegisterStartupScript(typeof(Page),“DeleteError”,“alert(‘不能刪除此類別,因為存在此類別的圖書’);”,true);//注冊頁面的啟動腳本,在瀏覽器彈出對話框。}}6.4.3etailsView控件及單條數據修改

6.4.4FormView控件及單條數據修改的靈活布局

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

Page_Load事件委托函數代碼如下: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控件及單條數據修改

類別樹控件SelectedNodeChanged事件委托函數代碼如下: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ā)出的,所以類別樹控件可以由參數sender直接轉換得到,而“TextBoxCategoryID”文本框是和類別樹控件同屬一個容器的子控件,所以,在類別樹控件的Parent控件中可以找到類別文本框,將類別樹控件中當前節(jié)點的Value(即類別ID)填入文本框后,隱藏類別樹控件。6.4.3etailsView控件及單條數據修改

“ImageButtonShowCategoryTree”按鈕用于顯示/隱藏類別樹控件,其Click事件委托函數如下:protectedvoidImageButtonShowCategoryTree_Click(objectsender,ImageClickEventArgse){UserControls_UC_CategoryTreecategoryTree=(UserControls_UC_CategoryTree)((senderasImageButton).Parent.FindControl("UC_CategoryTree1"));categoryTree.Visible=!categoryTree.Visible;if(categoryTree.Visible){//調用類別樹控件的SetCurrentNodeByValue方法選中、展開當前類別對應的節(jié)點TextBoxtbCategoryId=(TextBox)(categoryTree.Parent).FindControl("TextBoxCategoryID");categoryTree.SetCurrentNodeByValue(tbCategoryId.Text);}}6.4.3etailsView控件及單條數據修改

6.4.5DataList控件及數據顯示的靈活布局

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

在標記代碼源視圖,<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控件及單條數據修改

.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)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論