第19章 購貨車與訂單_第1頁
第19章 購貨車與訂單_第2頁
第19章 購貨車與訂單_第3頁
第19章 購貨車與訂單_第4頁
第19章 購貨車與訂單_第5頁
已閱讀5頁,還剩48頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、 網(wǎng)上商店模擬購物過程,先讓客戶從不同的網(wǎng)頁中選取商品,并將這些商品集中到“購貨車”中一道算帳,最后生成完整的訂單。 “虛擬購貨車”和“訂單”是商品采購中的核心部分,將要使用的技術(shù)包括:利用用戶控件和主控頁進(jìn)行界面設(shè)計(jì);數(shù)據(jù)表多表之間的同步;數(shù)據(jù)表的顯示、修改和統(tǒng)計(jì)。動(dòng)態(tài)生成內(nèi)存中的數(shù)據(jù)表以及使用Session對象保存數(shù)據(jù)并在網(wǎng)頁之間進(jìn)行傳遞等。 19.1.1 Northwind樣板庫簡介 SQL Server提供的Northwind樣板庫是一個(gè)虛擬的國外食品公司的數(shù)據(jù)庫,我們將利用這個(gè)數(shù)據(jù)庫(加以簡化)來創(chuàng)建自己的購貨車與訂單。 Northwind樣板庫的數(shù)據(jù)表包括以下4大部分: 訂單部分:

2、包含訂單表(Orders)、訂單細(xì)目(Order Details)、訂單發(fā)貨(Shippers); 產(chǎn)品部分:包括類型表(Categories)、產(chǎn)品表(Products)、產(chǎn)品提供者(Suppliers); 雇員信息部分:包括有關(guān)雇員(Employees)的4張表; 顧客信息:包括顧客表(Customers)等; 還需要在數(shù)據(jù)庫中自己建立一個(gè)簡化的訂單表。本例為一個(gè)網(wǎng)上食品商店的小型網(wǎng)站,主要功能包括: 主頁面設(shè)計(jì); 食品的分類顯示; 選購和調(diào)整購貨車; 集中結(jié)算; 存儲訂單; 查看訂單; 網(wǎng)站涉及到5種網(wǎng)頁,各網(wǎng)頁的功能如圖 : 主控頁 主頁 選擇商品(兩表同步) 購貨車 結(jié)帳 訂單(1)

3、產(chǎn)品類別表(2)產(chǎn)品顯示表(3)訂單表為什么要使用用戶控件和主控頁? 使得系統(tǒng)具有很好的可重用性; 使得系統(tǒng)具有很好的可維護(hù)性; 各個(gè)網(wǎng)頁的顯示風(fēng)格一致。 1、創(chuàng)建用戶控件商店的商標(biāo),網(wǎng)頁之間鏈接的圖標(biāo)以及查詢部分是大多數(shù)網(wǎng)頁都需要顯示的部分,可以先將其建成用戶控件。2、創(chuàng)建主控頁先創(chuàng)建主控頁,然后再創(chuàng)建模板中的網(wǎng)頁。主控頁及用戶控件如圖 :1、使用主控頁生成主網(wǎng)頁,其簡要情況如圖:2、使用主控頁再生成其他網(wǎng)頁:例如“商品.aspx”、“購貨車.aspx”、“結(jié)帳.aspx”、“訂單.aspx”等。這些網(wǎng)頁的內(nèi)容可以以后在補(bǔ)充上去。 在用戶控件中將鏈接指針分別與各張網(wǎng)頁鏈接。 為了使得“產(chǎn)品類

4、型表”與“產(chǎn)品表”之間取得同步(不同頁面之間的父子表同步),在顯示類型的GridView的Column屬性中增添一“超級鏈接列”,并且為此列設(shè)置同步所需的“URL”、“URL字段”、“URL格式字符串”等。使得點(diǎn)擊該超級鏈接按鈕時(shí)向子表傳送出同步字段“CategoryID”。具體設(shè)置情況如圖所示: 在“產(chǎn)品表”的網(wǎng)頁中利用QueryString設(shè)置查詢語句,以便根據(jù)屬性表傳來的參數(shù)進(jìn)行查詢,以達(dá)到兩表同步的目的。在產(chǎn)品表中設(shè)置查詢語句時(shí)的設(shè)置如圖所示: 兩表同步的結(jié)果如圖: 為了選擇商品,在產(chǎn)品表中的欄目(Column)中增加一按鈕(Button),并將它的CommdName屬性賦值為“sel

5、ect” ,當(dāng)點(diǎn)擊該按鈕時(shí),將該產(chǎn)品的副本取出來動(dòng)態(tài)生成數(shù)據(jù)表,利用這個(gè)動(dòng)態(tài)數(shù)據(jù)表來生成“購貨車”。需要解決以下三個(gè)問題: 按動(dòng)按鈕時(shí)將觸發(fā)什么事件(GridView1的RowCommand); 如何提取GridView控件中的數(shù)據(jù); 如何創(chuàng)建動(dòng)態(tài)數(shù)據(jù)表并將取出的數(shù)據(jù)放入其中。 GridView 控件中的RowCommand事件,是GridView控件內(nèi)任一按鈕都將觸發(fā)的事件。因此在使用這個(gè)事件時(shí),先要判斷當(dāng)前按動(dòng)的是哪個(gè)按鈕。判斷的方法是根據(jù)按鈕的命令名,語句如下:If (e.CommandName=按鈕命令名) 根據(jù)鼠標(biāo)點(diǎn)擊的“行”以及在GridView中的“列”,可以取出相應(yīng)的數(shù)據(jù): 確

6、定點(diǎn)擊行的語句:int index = Convert.ToInt32(e.CommandArgument);GridViewRow row = GridView1.Rowsindex; 取出某列的語句: string bhText = row.Cells1.Text; string mcText = row.Cells2.Text; 先根據(jù)類庫中的類生成數(shù)據(jù)表對象,然后定義數(shù)據(jù)表的結(jié)構(gòu),定義數(shù)據(jù)表各列的數(shù)據(jù)類型及標(biāo)題。/ 定義數(shù)據(jù)表對象 System.Data.DataTable Cart = new System.Data.DataTable(); / 確定各列的標(biāo)題及類型 Cart.Co

7、lumns.Add(商品編號, typeof(int); Cart.Columns.Add(商品名稱, typeof(string); Cart.Columns.Add(單元含量, typeof(string); Cart.Columns.Add(單價(jià), typeof(double); 創(chuàng)建內(nèi)存數(shù)據(jù)表的完整代碼如下: void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) System.Data.DataTable Cart = new System.Data.DataTable(); / 生成內(nèi)存數(shù)據(jù)表對象 i

8、f (e.CommandName = select) if (SessionShoppingCart = null) / 定義數(shù)據(jù)表結(jié)構(gòu) Cart.Columns.Add(商品編號, typeof(int); Cart.Columns.Add(商品名稱, typeof(string); Cart.Columns.Add(單元含量, typeof(string); Cart.Columns.Add(單價(jià), typeof(double); SessionShoppingCart = Cart; Cart = (System.Data.DataTable)SessionShoppingCart; i

9、nt index = Convert.ToInt32(e.CommandArgument); / 確定點(diǎn)擊的行 GridViewRow row = GridView1.Rowsindex; string bhText = row.Cells1.Text; / 取出列中的數(shù)據(jù) string mcText = row.Cells2.Text; string dyText = row.Cells4.Text; string djText = row.Cells5.Text; int bh = int.Parse(bhText); / 數(shù)據(jù)的類型轉(zhuǎn)換 double dj = double.Parse(

10、djText); System.Data.DataRow rr = Cart.NewRow(); rr商品編號=bh; / 將取出的數(shù)據(jù)放入數(shù)據(jù)表中 rr商品名稱 = mcText; rr單元含量 = dyText; rr單價(jià) = dj; Cart.Rows.Add(rr); / 將新行加入數(shù)據(jù)表中 SessionShoppingCart = Cart; / 將數(shù)據(jù)表放入Session中 在購貨車的顯示頁面中,將SessionShoppingCart作為數(shù)據(jù)源顯示在GridView中,語句如下:private void Page_Load(object sender, System.Event

11、Args e)GridView1.DataSource= SessionShoppingCart;DataBind(); 購貨車在這里是放在Session對象中的數(shù)據(jù)表,用Session對象保存購貨車很合適:1、每個(gè)客戶都有屬于自己的Session對象,即使多個(gè)客戶同時(shí)進(jìn)行網(wǎng)上購買時(shí),他們的數(shù)據(jù)也不會(huì)混雜。2、Session對象是一種臨時(shí)性的容器,適合購貨車的特點(diǎn)。 為了完善購貨車中的數(shù)據(jù)以便轉(zhuǎn)入結(jié)帳界面,在購貨車的窗體中還需要執(zhí)行以下5方面的工作:1、在窗體頁中用一“TextBox”輸入用戶標(biāo)志;2、在GridView控件中增加一個(gè)按鈕(Button),將其CommandName屬性設(shè)成“s

12、elect”;3、在GridView控件中增加一模板列,放入TextBox控件,以便輸入購買數(shù)量;4、在窗體頁的Page_Load事件中加上:if(!IsPostBack) /判斷是否第一次打開網(wǎng)頁5、在GridView的RowCommand事件中編寫代碼。 增加輸入用戶標(biāo)志的TextBox控件,以及相應(yīng)的“RequiredFieldValidator”校驗(yàn)控件,以防止輸入中的遺漏。 通過GridView的Columns屬性中增加一按鈕,并它的CommandName屬性命名(例如命名為“buy”),以便確認(rèn)選擇項(xiàng)。 在GridView控件中增加一個(gè)摸板列,將TextBox1控件放入ItemTe

13、mplate摸板中,以便輸入購買數(shù)量。先將其缺省值設(shè)為1。 private void Page_Load(object sender, System.EventArgs e) if(!IsPostBack)GridView1.DataSource= SessionShoppingCart;DataBind(); 只有網(wǎng)頁第一次打開時(shí)才執(zhí)行大括號中的語句。 事件處理代碼void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) System.Data.DataTable Cart = new System.Data.D

14、ataTable();/生成數(shù)據(jù)表生成數(shù)據(jù)表 if (e.CommandName = buy) if (SessionShoppingCart2 = null) Cart.Columns.Add(商品編號商品編號, typeof(int); /建立數(shù)據(jù)表結(jié)構(gòu)建立數(shù)據(jù)表結(jié)構(gòu) Cart.Columns.Add(商品名稱商品名稱, typeof(string); Cart.Columns.Add(單元含量單元含量, typeof(string); Cart.Columns.Add(單價(jià)單價(jià), typeof(double); Cart.Columns.Add(訂購數(shù)量訂購數(shù)量, typeof(int)

15、; Cart.Columns.Add(折扣折扣, typeof(double); Cart.Columns.Add(合計(jì)合計(jì), typeof(double); SessionShoppingCart2 = Cart; Cart = (System.Data.DataTable)SessionShoppingCart2; if (TextBox2.Text = ) / 輸入客戶標(biāo)記輸入客戶標(biāo)記 Validate(); / 調(diào)用校驗(yàn)控件進(jìn)行校驗(yàn)調(diào)用校驗(yàn)控件進(jìn)行校驗(yàn) else Session“khbj” = TextBox2.Text; int index = Convert.ToInt32(e.C

16、ommandArgument); GridViewRow row = GridView1.Rowsindex; TextBox tt = (System.Web.UI.WebControls.TextBox)row.Cells1.FindControl(TextBox1); string dgl = tt.Text; int dg = int.Parse(dgl); if (dg = 1) dg = 1; / 若購貨量小于若購貨量小于1時(shí),定為時(shí),定為1 string bhText = row.Cells2.Text; string mcText = row.Cells3.Text; stri

17、ng dyText = row.Cells4.Text; string djText = row.Cells5.Text; int bh = int.Parse(bhText); double dj = double.Parse(djText);System.Data.DataRow rr = Cart.NewRow(); rr商品編號=bh; rr商品名稱 = mcText; rr單元含量 = dyText; rr單價(jià) = dj; rr訂購數(shù)量 = dg; int zk = 1; rr折扣 = zk; double hj = dj * dg * zk; / 合計(jì)使用三者的乘積 rr合計(jì) =

18、hj; Cart.Rows.Add(rr); SessionShoppingCart2 = Cart; 19.7.1 結(jié)帳網(wǎng)頁的數(shù)據(jù)顯示 在結(jié)帳網(wǎng)頁中的GridView控件應(yīng)該以Session“ShoppingCart2”作為數(shù)據(jù)源顯示數(shù)據(jù):private void Page_Load(object sender, System.EventArgs e)GridView1.DataSource= SessionShoppingCart2;DataBind(); 為了允許客戶在結(jié)帳時(shí)有機(jī)會(huì)對自己的選擇作進(jìn)一步調(diào)整,可以在結(jié)帳界面的每條記錄前面增加一“復(fù)選框”。 在GridView中通過Colum

19、n屬性增添一“模板”字段,并且在模板中增添復(fù)選框控件。 為了進(jìn)行匯總計(jì)算,需設(shè)置循環(huán)語句,逐條檢查復(fù)選框的選擇狀態(tài),只有當(dāng)該復(fù)選框被選中時(shí),才將該記錄的數(shù)據(jù)計(jì)入?yún)R總中。 用到一個(gè)相關(guān)的類和一個(gè)相關(guān)的方法:1、GridView1.Rowsii用來表示 GridView 控件中的某一行。2、FindControl(控件的id)方法:用來在當(dāng)前的命名容器中搜索帶指定 id 參數(shù)的服務(wù)器控件。 void Button2_Click(object sender, EventArgs e) double sum=0.0; for(int ii=0; ii GridView1.Rows.Count;ii+)

20、 CheckBox cc = (CheckBox)GridView1.Rowsii.Cells0.FindControl(CheckBox1); if(cc.Checked) / 若復(fù)選框被選中 sum = sum + (double.Parse(GridView1.Rowsii.Cells7.Text); TextBox2.Text=sum.ToString(); / 顯示匯總結(jié)果 為實(shí)現(xiàn)復(fù)選框的功能,在Page_Load事件中需要作一些改變。代碼如下:void Page_Load(object sender, EventArgs e) if (!IsPostBack) TextBox1.T

21、ext = Sessionkhbz.ToString(); GridView1.DataSource = SessionShoppingCart2; GridView1.DataBind(); 如果客戶對結(jié)果感到滿意時(shí),可按動(dòng)“存入數(shù)據(jù)庫”按鈕,將定單存入數(shù)據(jù)庫的“定單表” 中。 存入時(shí)使用存儲過程,為此需要先建立訂單表,并創(chuàng)建一個(gè)用于增加新記錄的存儲過程。 拖入一SqlDataSource控件并與存儲過程連接。連接過程中最大的不同點(diǎn)是待定參數(shù)的值不是從固定的控件中讀取,而是通過循環(huán)語句從GridView控件的字段中獲得。 待定參數(shù)的賦值過程是:開始對GridView控件進(jìn)行逐條記錄進(jìn)行循環(huán);

22、在循環(huán)語句中首先取出復(fù)選框的狀態(tài),判斷復(fù)選框是否被選中;如果被選中,先清除原有參數(shù),然后給各參數(shù)賦值;最后調(diào)用存儲過程以存入訂單。 “存入訂單”按鈕的代碼如下:void Button1_Click(object sender, EventArgs e) for (int ii=0; iiGridView1.Rows.Count; ii+) / 循環(huán)語句 / 先判斷復(fù)選框是否被選擇CheckBox cc=(CheckBox)GridView1.Rowsii.Cells0.FindControl(CheckBox1); if (cc.Checked) / 如果被選中則取出數(shù)據(jù)存入數(shù)據(jù)表中SqlDataSource1.InsertParameters.Clear();SqlDataSource1.InsertParameters.Add(客戶ID,SessionKhbj.ToString();SqlDataSource1.InsertParameters.Add(產(chǎn)品ID,GridView1.Rowsii.Cells1.Text);SqlDataSource1.InsertParameters.Add(產(chǎn)品名稱, GridView1.Rowsii.Cells2.T

溫馨提示

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

最新文檔

評論

0/150

提交評論