第19章购货车与订单_第1页
第19章购货车与订单_第2页
第19章购货车与订单_第3页
第19章购货车与订单_第4页
第19章购货车与订单_第5页
已阅读5页,还剩48页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 网上商店模拟购物过程,先让客户从不同的网页中选取商品,并将这些商品集中到“购货车”中一道算帐,最后生成完整的订单。 “虚拟购货车”和“订单”是商品采购中的核心部分,将要使用的技术包括:利用用户控件和主控页进行界面设计;数据表多表之间的同步;数据表的显示、修改和统计。动态生成内存中的数据表以及使用Session对象保存数据并在网页之间进行传递等。 19.1.1 Northwind样板库简介 SQL Server提供的Northwind样板库是一个虚拟的国外食品公司的数据库,我们将利用这个数据库(加以简化)来创建自己的购货车与订单。 Northwind样板库的数据表包括以下4大部分: 订单部分:

2、包含订单表(Orders)、订单细目(Order Details)、订单发货(Shippers); 产品部分:包括类型表(Categories)、产品表(Products)、产品提供者(Suppliers); 雇员信息部分:包括有关雇员(Employees)的4张表; 顾客信息:包括顾客表(Customers)等; 还需要在数据库中自己建立一个简化的订单表。本例为一个网上食品商店的小型网站,主要功能包括: 主页面设计; 食品的分类显示; 选购和调整购货车; 集中结算; 存储订单; 查看订单; 网站涉及到5种网页,各网页的功能如图 : 主控页 主页 选择商品(两表同步) 购货车 结帐 订单(1)

3、产品类别表(2)产品显示表(3)订单表为什么要使用用户控件和主控页? 使得系统具有很好的可重用性; 使得系统具有很好的可维护性; 各个网页的显示风格一致。 1、创建用户控件商店的商标,网页之间链接的图标以及查询部分是大多数网页都需要显示的部分,可以先将其建成用户控件。2、创建主控页先创建主控页,然后再创建模板中的网页。主控页及用户控件如图 :1、使用主控页生成主网页,其简要情况如图:2、使用主控页再生成其他网页:例如“商品.aspx”、“购货车.aspx”、“结帐.aspx”、“订单.aspx”等。这些网页的内容可以以后在补充上去。 在用户控件中将链接指针分别与各张网页链接。 为了使得“产品类

4、型表”与“产品表”之间取得同步(不同页面之间的父子表同步),在显示类型的GridView的Column属性中增添一“超级链接列”,并且为此列设置同步所需的“URL”、“URL字段”、“URL格式字符串”等。使得点击该超级链接按钮时向子表传送出同步字段“CategoryID”。具体设置情况如图所示: 在“产品表”的网页中利用QueryString设置查询语句,以便根据属性表传来的参数进行查询,以达到两表同步的目的。在产品表中设置查询语句时的设置如图所示: 两表同步的结果如图: 为了选择商品,在产品表中的栏目(Column)中增加一按钮(Button),并将它的CommdName属性赋值为“sel

5、ect” ,当点击该按钮时,将该产品的副本取出来动态生成数据表,利用这个动态数据表来生成“购货车”。需要解决以下三个问题: 按动按钮时将触发什么事件(GridView1的RowCommand); 如何提取GridView控件中的数据; 如何创建动态数据表并将取出的数据放入其中。 GridView 控件中的RowCommand事件,是GridView控件内任一按钮都将触发的事件。因此在使用这个事件时,先要判断当前按动的是哪个按钮。判断的方法是根据按钮的命令名,语句如下:If (e.CommandName=按钮命令名) 根据鼠标点击的“行”以及在GridView中的“列”,可以取出相应的数据: 确

6、定点击行的语句:int index = Convert.ToInt32(e.CommandArgument);GridViewRow row = GridView1.Rowsindex; 取出某列的语句: string bhText = row.Cells1.Text; string mcText = row.Cells2.Text; 先根据类库中的类生成数据表对象,然后定义数据表的结构,定义数据表各列的数据类型及标题。/ 定义数据表对象 System.Data.DataTable Cart = new System.Data.DataTable(); / 确定各列的标题及类型 Cart.Co

7、lumns.Add(商品编号, typeof(int); Cart.Columns.Add(商品名称, typeof(string); Cart.Columns.Add(单元含量, typeof(string); Cart.Columns.Add(单价, typeof(double); 创建内存数据表的完整代码如下: void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) System.Data.DataTable Cart = new System.Data.DataTable(); / 生成内存数据表对象 i

8、f (e.CommandName = select) if (SessionShoppingCart = null) / 定义数据表结构 Cart.Columns.Add(商品编号, typeof(int); Cart.Columns.Add(商品名称, typeof(string); Cart.Columns.Add(单元含量, typeof(string); Cart.Columns.Add(单价, typeof(double); SessionShoppingCart = Cart; Cart = (System.Data.DataTable)SessionShoppingCart; i

9、nt index = Convert.ToInt32(e.CommandArgument); / 确定点击的行 GridViewRow row = GridView1.Rowsindex; string bhText = row.Cells1.Text; / 取出列中的数据 string mcText = row.Cells2.Text; string dyText = row.Cells4.Text; string djText = row.Cells5.Text; int bh = int.Parse(bhText); / 数据的类型转换 double dj = double.Parse(

10、djText); System.Data.DataRow rr = Cart.NewRow(); rr商品编号=bh; / 将取出的数据放入数据表中 rr商品名称 = mcText; rr单元含量 = dyText; rr单价 = dj; Cart.Rows.Add(rr); / 将新行加入数据表中 SessionShoppingCart = Cart; / 将数据表放入Session中 在购货车的显示页面中,将SessionShoppingCart作为数据源显示在GridView中,语句如下:private void Page_Load(object sender, System.Event

11、Args e)GridView1.DataSource= SessionShoppingCart;DataBind(); 购货车在这里是放在Session对象中的数据表,用Session对象保存购货车很合适:1、每个客户都有属于自己的Session对象,即使多个客户同时进行网上购买时,他们的数据也不会混杂。2、Session对象是一种临时性的容器,适合购货车的特点。 为了完善购货车中的数据以便转入结帐界面,在购货车的窗体中还需要执行以下5方面的工作:1、在窗体页中用一“TextBox”输入用户标志;2、在GridView控件中增加一个按钮(Button),将其CommandName属性设成“s

12、elect”;3、在GridView控件中增加一模板列,放入TextBox控件,以便输入购买数量;4、在窗体页的Page_Load事件中加上:if(!IsPostBack) /判断是否第一次打开网页5、在GridView的RowCommand事件中编写代码。 增加输入用户标志的TextBox控件,以及相应的“RequiredFieldValidator”校验控件,以防止输入中的遗漏。 通过GridView的Columns属性中增加一按钮,并它的CommandName属性命名(例如命名为“buy”),以便确认选择项。 在GridView控件中增加一个摸板列,将TextBox1控件放入ItemTe

13、mplate摸板中,以便输入购买数量。先将其缺省值设为1。 private void Page_Load(object sender, System.EventArgs e) if(!IsPostBack)GridView1.DataSource= SessionShoppingCart;DataBind(); 只有网页第一次打开时才执行大括号中的语句。 事件处理代码void GridView1_RowCommand(object sender, GridViewCommandEventArgs e) System.Data.DataTable Cart = new System.Data.D

14、ataTable();/生成数据表生成数据表 if (e.CommandName = buy) if (SessionShoppingCart2 = null) Cart.Columns.Add(商品编号商品编号, typeof(int); /建立数据表结构建立数据表结构 Cart.Columns.Add(商品名称商品名称, typeof(string); Cart.Columns.Add(单元含量单元含量, typeof(string); Cart.Columns.Add(单价单价, typeof(double); Cart.Columns.Add(订购数量订购数量, typeof(int)

15、; Cart.Columns.Add(折扣折扣, typeof(double); Cart.Columns.Add(合计合计, typeof(double); SessionShoppingCart2 = Cart; Cart = (System.Data.DataTable)SessionShoppingCart2; if (TextBox2.Text = ) / 输入客户标记输入客户标记 Validate(); / 调用校验控件进行校验调用校验控件进行校验 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时,定为时,定为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单价 = dj; rr订购数量 = dg; int zk = 1; rr折扣 = zk; double hj = dj * dg * zk; / 合计使用三者的乘积 rr合计 =

18、hj; Cart.Rows.Add(rr); SessionShoppingCart2 = Cart; 19.7.1 结帐网页的数据显示 在结帐网页中的GridView控件应该以Session“ShoppingCart2”作为数据源显示数据:private void Page_Load(object sender, System.EventArgs e)GridView1.DataSource= SessionShoppingCart2;DataBind(); 为了允许客户在结帐时有机会对自己的选择作进一步调整,可以在结帐界面的每条记录前面增加一“复选框”。 在GridView中通过Colum

19、n属性增添一“模板”字段,并且在模板中增添复选框控件。 为了进行汇总计算,需设置循环语句,逐条检查复选框的选择状态,只有当该复选框被选中时,才将该记录的数据计入汇总中。 用到一个相关的类和一个相关的方法:1、GridView1.Rowsii用来表示 GridView 控件中的某一行。2、FindControl(控件的id)方法:用来在当前的命名容器中搜索带指定 id 参数的服务器控件。 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) / 若复选框被选中 sum = sum + (double.Parse(GridView1.Rowsii.Cells7.Text); TextBox2.Text=sum.ToString(); / 显示汇总结果 为实现复选框的功能,在Page_Load事件中需要作一些改变。代码如下:void Page_Load(object sender, EventArgs e) if (!IsPostBack) TextBox1.T

21、ext = Sessionkhbz.ToString(); GridView1.DataSource = SessionShoppingCart2; GridView1.DataBind(); 如果客户对结果感到满意时,可按动“存入数据库”按钮,将定单存入数据库的“定单表” 中。 存入时使用存储过程,为此需要先建立订单表,并创建一个用于增加新记录的存储过程。 拖入一SqlDataSource控件并与存储过程连接。连接过程中最大的不同点是待定参数的值不是从固定的控件中读取,而是通过循环语句从GridView控件的字段中获得。 待定参数的赋值过程是:开始对GridView控件进行逐条记录进行循环;

22、在循环语句中首先取出复选框的状态,判断复选框是否被选中;如果被选中,先清除原有参数,然后给各参数赋值;最后调用存储过程以存入订单。 “存入订单”按钮的代码如下:void Button1_Click(object sender, EventArgs e) for (int ii=0; iiGridView1.Rows.Count; ii+) / 循环语句 / 先判断复选框是否被选择CheckBox cc=(CheckBox)GridView1.Rowsii.Cells0.FindControl(CheckBox1); if (cc.Checked) / 如果被选中则取出数据存入数据表中SqlDataSource1.InsertParameters.Clear();SqlDataSource1.InsertParameters.Add(客户ID,SessionKhbj.ToString();SqlDataSource1.InsertParameters.Add(产品ID,GridView1.Rowsii.Cells1.Text);SqlDataSource1.InsertParameters.Add(产品名称, GridView1.Rowsii.Cells2.T

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论