本示例利用Session对象来实现一个简单的购物车主要用于教学演示
Book类
此类主是代表购物车的一本书
using System;
namespace CartTest
{
/// <summary>
/// Books 的摘要说明
/// </summary>
public class Book
{
string bookid;
string title;
decimal price;
int num;
public Book()
{
}
/// <summary>
/// ID
/// </summary>
public string BookID
{
get{return bookid;}
set{bookid=value;}
}
/// <summary>
/// 书名
/// </summary>
public string Title
{
get{return title;}
set{title=value;}
}
/// <summary>
/// 金额
/// </summary>
public decimal Price
{
get{return price;}
set{price=value;
sum=price*num;
}
}
/// <summary>
/// 数量
/// </summary>
public int Num
{
get{return num;}
set{num=value;
sum=price*num;
}
}
decimal sum=m;
//一种书的总金额
public decimal Sum
{
get{return sum;}
set{sum=value;}
}
}
}
//购物车集合
//Books 用户所有订购的书 实现IEnumerable接口我们可以将其绑定到datagrid控件
using System;
using SystemCollections;
namespace CartTest
{
/// <summary>
///
/// </summary>
public class Books :IEnumerable
{
Hashtable ht=null;
public Books()
{
ht=new Hashtable();
}
public Books(int count)
{
ht=new Hashtable(count);
}
public void Add(Book b)
{
//如果集合中有相同ID的书则对书的数量进行相加
if(htContainsKey(bBookID))
{
((Book)ht[bBookID])Num=((Book)ht[bBookID])Num+bNum;
}
else
{
htAdd(bBookIDb);
}
}
public void Remove(string bookid)
{
if(htContainsKey(bookid))
htRemove(bookid);
}
//统计有多少种书
public int Count
{
get
{
return htCount;
}
}
public void Clear()
{
htClear();
}
public Book this[string bookid]
{
get
{
if(htContainsKey(bookid))
return (Book)ht[bookid];
return null;
}
}
#region IEnumerable 成员
public IEnumerator GetEnumerator()
{
// TODO: 添加 BooksGetEnumerator 实现
return htValuesGetEnumerator();
}
#endregion
}
}
//此页面主要是用于显示所有的书用的是DataList来自定义显示模板但是实际上可以使用DataGrid来处理DataGrid也可以实现分页功能及自定义模板只要将dDatagrid设为一个模板列然后将DataList里的模板列代码Copy过去即可
//此页面中每本书都要显示封面这个问题我们可以通过一个过渡页来处理图片数据
<%@ Page language=c# Codebehind=BookListaspxcs AutoEventWireup=false Inherits=CartTestBookList %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
<HTML>
<HEAD>
<title>BookList</title>
<meta content=Microsoft Visual Studio NET name=GENERATOR>
<meta content=C# name=CODE_LANGUAGE>
<meta content=javascript name=vs_defaultClientScript>
<meta content= name=vs_targetSchema>
<LINK text/css rel=stylesheet>
</HEAD>
<body MS_POSITIONING=GridLayout>
<form id=Form method=post runat=server>
<asp:datalist id=DataList runat=server
DataKeyField=BookGuid Width=>
<ItemTemplate>
<TABLE id=Table cellSpacing= cellPadding= border=>
<TR>
<TD>
<a <%# BookViewaspx?BookID=+DataBinderEval(Container DataItemBookGuid) %>>
<!imageviewaspx页面专用来处理书的图片><asp:Image id=Image runat=server Width=px Height=px ImageUrl=<%# ImageViewaspx?imgid=+DataBinderEval(Container DataItemBookGuid) %>>
</asp:Image>
</a>
</TD>
<TD vAlign=top>
<TABLE id=Table cellSpacing= cellPadding= width= border=>
<TR>
<TD>书名
<asp:Label id=Label runat=server Text=<%# DataBinderEval(Container DataItemBookTitle) %>>
</asp:Label></TD>
</TR>
<TR>
<TD>图书简介
<asp:Label id=Label runat=server Width= Text=<%# <nobr>+DataBinderEval(Container DataItemBookComment)+/<nobr>%> Height=px>
</asp:Label></TD>
</TR>
<TR>
<TD>金额
<asp:Label id=Label runat=server Text=<%# DataBinderEval(Container DataItemPrice{:C}) %>>
</asp:Label></TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD>
<asp:Label id=Label runat=server>日期</asp:Label>
<asp:Label id=Label runat=server Text=<%# DataBinderEval(Container DataItemPublishDate {:D}) %>>
</asp:Label></TD>
<TD align=right>
<asp:ImageButton id=Imagebutton runat=server ImageUrl=agif CommandName=AddCart></asp:ImageButton></TD>
</TR>
</TABLE>
</ItemTemplate>
<AlternatingItemTemplate>
<TABLE id=Table cellSpacing= cellPadding= bgColor=#eefeff border=>
<TR>
<TD>
<a <%# BookViewaspx?BookID=+DataBinderEval(Container DataItemBookGuid) %>>
<!imageviewaspx页面专用来处理书的图片><asp:Image id=Image runat=server Width=px Height=px ImageUrl=<%# ImageViewaspx?imgid=+DataBinderEval(Container DataItemBookGuid) %>>
</asp:Image></a></TD>
<TD vAlign=top>
<TABLE id=Table cellSpacing= cellPadding= width= border=>
<TR>
<TD>书名
<asp:Label id=Label runat=server Text=<%# DataBinderEval(Container DataItemBookTitle) %>>
</asp:Label></TD>
</TR>
<TR>
<TD>图书简介
<asp:Label id=Label runat=server Width=px Text=<%# DataBinderEval(Container DataItemBookComment) %> Height=px>
</asp:Label></TD>
</TR>
<TR>
<TD>金额
<asp:Label id=Label runat=server Text=<%# DataBinderEval(Container DataItemPrice) %>>
</asp:Label></TD>
</TR>
</TABLE>
</TD>
</TR>
<TR>
<TD>
<asp:Label id=Label runat=server>日期</asp:Label>
<asp:Label id=Label runat=server Text=<%# DataBinderEval(Container DataItemPublishDate) %>>
</asp:Label></TD>
<TD align=right>
<asp:ImageButton id=Imagebutton runat=server ImageUrl=agif></asp:ImageButton></TD>
</TR>
</TABLE>
</AlternatingItemTemplate>
</asp:datalist></form>
</body>
</HTML>
//CS CODE
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemWeb;
using SystemWebSessionState;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIHtmlControls;
using SystemDataSqlClient;
namespace CartTest
{
/// <summary>
/// BookList 的摘要说明
/// </summary>
public class BookList : SystemWebUIPage
{
protected SystemWebUIWebControlsDataList DataList;
private void Page_Load(object sender SystemEventArgs e)
{
if(!thisIsPostBack)
{
SqlConnection cn=new SqlConnection();
cnConnectionString=server=;uid=sa;pwd=;database=p;
cnOpen();
SqlCommand cmd=new SqlCommand();
cmdConnection=cn;
cmdCommandText=select * from books ;
SqlDataAdapter da=new SqlDataAdapter();
daSelectCommand=cmd;
DataSet ds=new DataSet();
daFill(ds);
cnClose();
thisDataListDataSource=dsTables[];
thisDataBind();
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASPNET Web 窗体设计器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
/// </summary>
private void InitializeComponent()
{
thisDataListItemCommand += new SystemWebUIWebControlsDataListCommandEventHandler(thisDataList_ItemCommand);
thisLoad += new SystemEventHandler(thisPage_Load);
}
#endregion
private void DataList_ItemCommand(object source SystemWebUIWebControlsDataListCommandEventArgs e)
{
//用户选中一本书后默认订一本书
string bookGuid=thisDataListDataKeys[eItemItemIndex]ToString();
Book b=new Book();
//首先获得自己的购物车
Books bs=(Books)Session[MyCart];
bBookID=bookGuid;
bNum=;
//根据ITEM的类型取值
if(eItemItemType==ListItemTypeItem)
{
bPrice=ConvertToDecimal(((Label)eItemFindControl(Label))TextSubstring());
bTitle=((Label)eItemFindControl(Label))Text;
}
else if(eItemItemType==ListItemTypeAlternatingItem)
{
bPrice=ConvertToDecimal(((Label)eItemFindControl(Label))TextSubstring());
bTitle=((Label)eItemFindControl(Label))Text;
}
//将书加入到购物车
bsAdd(b);
Session[MyCart]=bs;
//打开购物车页面
ResponseWrite(<script>windowopen(webformaspx)</script>);
}
}
}
//图片处理页
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemWeb;
using SystemWebSessionState;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIHtmlControls;
using SystemDataSqlClient;
namespace CartTest
{
/// <summary>
/// ImageView 的摘要说明
/// </summary>
public class ImageView : SystemWebUIPage
{
private void Page_Load(object sender SystemEventArgs e)
{
SqlConnection cn=new SqlConnection();
cnConnectionString=server=;uid=sa;pwd=;database=p;
cnOpen();
SqlCommand cmd=new SqlCommand();
cmdConnection=cn;
cmdCommandText=select cover from books where bookguid=+ thisRequestQueryString[imgid]ToString() +;
//cmdCommandText=select cover from books where bookguid=bcadcbeeee;
SqlDataAdapter da=new SqlDataAdapter();
daSelectCommand=cmd;
DataSet ds=new DataSet();
daFill(ds);
cnClose();
ResponseClear();
ResponseClearContent();
ResponseContentType=Image/jpg;
ResponseBinaryWrite((byte[])dsTables[]Rows[][]);
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASPNET Web 窗体设计器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
/// </summary>
private void InitializeComponent()
{
thisLoad += new SystemEventHandler(thisPage_Load);
}
#endregion
}
}
//当用户选取其中一本书时获得用户当前选中书的ID将此ID传到具体察看页面
<%@ Page language=c# Codebehind=BookViewaspxcs AutoEventWireup=false Inherits=CartTestBookView %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
<HTML>
<HEAD>
<title>BookView</title>
<meta name=GENERATOR Content=Microsoft Visual Studio NET >
<meta name=CODE_LANGUAGE Content=C#>
<meta name=vs_defaultClientScript content=javascript>
<meta name=vs_targetSchema content=>
</HEAD>
<body MS_POSITIONING=GridLayout>
<form id=Form method=post runat=server>
<FONT face=宋体>
<asp:Label id=Label runat=server
Width=px Height=px></asp:Label>
<asp:Image id=Image runat=server
Width=px Height=px></asp:Image>
<asp:Label id=Label runat=server
Width=px></asp:Label>
<asp:Label id=Label runat=server Width=px>Label</asp:Label>
<asp:Panel id=Panel runat=server Height=px Width=px></asp:Panel>
<asp:Label id=Label runat=server Width=px>Label</asp:Label></FONT>
</form>
</body>
</HTML>
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemWeb;
using SystemWebSessionState;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIHtmlControls;
using SystemDataSqlClient;
namespace CartTest
{
/// <summary>
/// BookView 的摘要说明
/// </summary>
public class BookView : SystemWebUIPage
{
protected SystemWebUIWebControlsLabel Label;
protected SystemWebUIWebControlsImage Image;
protected SystemWebUIWebControlsLabel Label;
protected SystemWebUIWebControlsLabel Label;
protected SystemWebUIWebControlsTextBox TextBox;
protected SystemWebUIWebControlsLabel Label;
protected SystemWebUIWebControlsPanel Panel;
protected SystemWebUIWebControlsLabel Label;
protected SystemWebUIWebControlsPanel Panel;
private void Page_Load(object sender SystemEventArgs e)
{
if(!thisIsPostBack)
{
if(thisRequest[BookID]!=null)
{
thisImageImageUrl=ImageViewaspx?imgid=+thisRequest[BookID]ToString();
SqlConnection cn=new SqlConnection();
cnConnectionString=server=;uid=sa;pwd=;database=p;
cnOpen();
SqlCommand cmd=new SqlCommand();
cmdConnection=cn;
cmdCommandText=select * from books where bookguid=+ thisRequestQueryString[BookID]ToString() +;
//cmdCommandText=select cover from books where bookguid=bcadcbeeee;
SqlDataAdapter da=new SqlDataAdapter();
daSelectCommand=cmd;
DataSet ds=new DataSet();
daFill(ds);
cnClose();
thisLabelText=dsTables[]Rows[][]ToString();
thisLabelText=dsTables[]Rows[][]ToString();
thisLabelText=dsTables[]Rows[][]ToString();
thisPanelControlsAdd(new LiteralControl(dsTables[]Rows[][]ToString()));
}
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASPNET Web 窗体设计器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
/// </summary>
private void InitializeComponent()
{
thisLoad += new SystemEventHandler(thisPage_Load);
}
#endregion
}
}
//购物车页面实现此功能主要使用DataGrid来显示总计功能
<%@ Page language=c# Codebehind=WebFormaspxcs AutoEventWireup=false Inherits=CartTestWebForm %>
<!DOCTYPE HTML PUBLIC //WC//DTD HTML Transitional//EN >
<HTML>
<HEAD>
<title>WebForm</title>
<meta name=GENERATOR Content=Microsoft Visual Studio NET >
<meta name=CODE_LANGUAGE Content=C#>
<meta name=vs_defaultClientScript content=javascript>
<meta name=vs_targetSchema content=>
<script>
//此JS主要是防止用户输入非数字
function checkNum()
{
var chr=StringfromCharCode(eventkeyCode);
if(isNaN(chr))
{
eventkeyCode=;
}
}
</script>
</HEAD>
<body MS_POSITIONING=GridLayout>
<form id=Form method=post runat=server>
<asp:DataGrid id=DataGrid runat=server AutoGenerateColumns=False PageSize= FontSize=XXSmall
CellPadding= DataKeyField=BookID BorderStyle=Solid BorderColor=SkyBlue BorderWidth=px
ShowFooter=True Width=px>
<ItemStyle BackColor=#EEEEEE></ItemStyle>
<HeaderStyle FontSize=pt FontBold=True BackColor=SkyBlue></HeaderStyle>
<Columns>
<asp:TemplateColumn HeaderText=书名>
<ItemTemplate>
<asp:Label id=Label runat=server Text=<%# DataBinderEval(Container DataItemTitle) %>>
</asp:Label>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText=单价>
<ItemTemplate>
<asp:TextBox id=txtPrice runat=server Text=<%# DataBinderEval(Container DataItemPrice) %> ReadOnly=True>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText=数量>
<ItemTemplate>
<asp:TextBox id=txtNum onkeypress=checkNum() runat=server Text=<%# DataBinderEval(Container DataItemNum) %>>
</asp:TextBox>
</ItemTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText=总金额>
<ItemTemplate>
<asp:TextBox id=txtSum runat=server ReadOnly=True Text=<%# DataBinderEval(Container DataItemSum) %>>
</asp:TextBox>
</ItemTemplate>
<FooterTemplate>
<asp:TextBox id=txtSumPrice runat=server ReadOnly=True></asp:TextBox>
</FooterTemplate>
</asp:TemplateColumn>
<asp:TemplateColumn HeaderText=操作>
<ItemTemplate>
<asp:LinkButton id=LinkButton runat=server CommandName=editBook>修改</asp:LinkButton><FONT face=宋体> </FONT>
<asp:LinkButton id=LinkButton runat=server CommandName=delBook>删除</asp:LinkButton>
</ItemTemplate>
</asp:TemplateColumn>
</Columns>
<PagerStyle NextPageText= FontSize=pt FontNames=webdings PrevPageText= BackColor=SkyBlue></PagerStyle>
</asp:DataGrid>
</form>
</body>
</HTML>
//购物车察看页里的数据是Session里所存放的Books集合对象可以将其绑定到网格控件
using System;
using SystemCollections;
using SystemComponentModel;
using SystemData;
using SystemDrawing;
using SystemWeb;
using SystemWebSessionState;
using SystemWebUI;
using SystemWebUIWebControls;
using SystemWebUIHtmlControls;
using SystemDataSqlClient;
namespace CartTest
{
/// <summary>
/// WebForm 的摘要说明
/// </summary>
public class WebForm : SystemWebUIPage
{
protected SystemWebUIWebControlsDataGrid DataGrid;
private void Page_Load(object sender SystemEventArgs e)
{
if(!thisIsPostBack)
{
Books bs=(Books)Session[MyCart];
thisDataGridDataSource=bs;
thisDataBind();
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASPNET Web 窗体设计器所必需的
//
InitializeComponent();
baseOnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 不要使用代码编辑器修改
/// 此方法的内容
/// </summary>
private void InitializeComponent()
{
thisDataGridItemCreated += new SystemWebUIWebControlsDataGridItemEventHandler(thisDataGrid_ItemCreated);
thisDataGridItemCommand += new SystemWebUIWebControlsDataGridCommandEventHandler(thisDataGrid_ItemCommand);
thisDataGridItemDataBound += new SystemWebUIWebControlsDataGridItemEventHandler(thisDataGrid_ItemDataBound);
thisLoad += new SystemEventHandler(thisPage_Load);
}
#endregion
//利用此事件对网格控件的外观进行控件(合并列)
private void DataGrid_ItemCreated(object sender SystemWebUIWebControlsDataGridItemEventArgs e)
{
ListItemType itemType = eItemItemType;
if (itemType == ListItemTypeFooter)
{
//eItemBackColor = ColorSeaGreen;
//eItemFontBold = true;
eItemCellsRemoveAt();
eItemCellsRemoveAt();
eItemCells[]ColumnSpan = ;
eItemCells[]HorizontalAlign = HorizontalAlignRight;
}
}
private void DataGrid_ItemCommand(object source SystemWebUIWebControlsDataGridCommandEventArgs e)
{
Books bs=(Books)Session[MyCart];
if(eCommandName==editBook)
{
int num=ConvertToInt(((TextBox)eItemFindControl(txtNum))Text);
decimal p=ConvertToDecimal(((TextBox)eItemFindControl(txtPrice))Text);
bs[thisDataGridDataKeys[eItemItemIndex]ToString()]Sum=p*num;
bs[thisDataGridDataKeys[eItemItemIndex]ToString()]Num=num;
}
else if(eCommandName==delBook)
{
bsRemove(thisDataGridDataKeys[eItemItemIndex]ToString());
}
thisDataGridDataSource=bs;
thisDataBind();
Session[MyCart]=bs;
}
private void DataGrid_ItemDataBound(object sender SystemWebUIWebControlsDataGridItemEventArgs e)
{
ListItemType itemType = eItemItemType;
if (itemType == ListItemTypeFooter)
{
decimal sum=;
foreach(DataGridItem item in thisDataGridItems)
{
decimal p=ConvertToDecimal(((TextBox) itemFindControl(txtPrice))Text);
int n=ConvertToInt(((TextBox) itemFindControl(txtNum))Text);
sum+=p*n;
}
((TextBox)eItemFindControl(txtSumPrice))Text=sumToString();
}
}
}
}
此外我们还要在GlobalasaxCS文件中将变量进行初始化确保每个客户端访问网站时都有一个购物车当然里面是没有书的
此购物车实现的原理很简单首先自己定义一个货物类及货物集合类(实现IEnumerable集合)当每个用户进入到网站时首先给其分配一个空的购物车当用户在购物页面选取一个货物时取得该货物同时获得自己的购物车将货物保存到购物车中最后再保存购物车如果用户要对购物车中的内容进行修改也是一样的原理而且在购物车察看页我们则将自己生成的集合类对象绑定到我们的页面中利用网格窗控年的一此事件来处理货物统计的问题