这是我的“加入购物车”系统,当多次加入同一个商品时,(数量和总价计算都正常),但如果加入了另一个商品时,就出问题了。DataTable 中总会多出不需要的行。
请大家帮我看看。急用!protected void BtnAddToCar_Click(object sender, EventArgs e)
{
int goodsId = Int32.Parse(this.DetailsView1.Rows[0].Cells[1].Text);
string theGoodsName = (this.DetailsView1.Rows[1].Cells[1].Text).ToString();
decimal thePrice = Convert.ToDecimal(this.DetailsView1.Rows[5].Cells[1].Text);//DataTable dtb = Session["myCar"] as DataTable;if (Session["myCar"] == null)
{
DataTable dtb = new DataTable();
dtb.Columns.Add("goodsId", typeof(int));
dtb.Columns.Add("thtGoodsName");
dtb.Columns.Add("thePrice");
dtb.Columns.Add("TheCount");
dtb.Columns.Add("TotalPrice");
DataRow dRow = dtb.NewRow();
dRow["goodsId"] = goodsId;
dRow["thtGoodsName"] = theGoodsName;
dRow["thePrice"] = thePrice;
dRow["TheCount"] = 1;
dRow["TotalPrice"] = thePrice;
dtb.Rows.Add(dRow);
Session["myCar"] = dtb;}else
{
DataTable dtb = Session["myCar"] as DataTable;
for (int i = 0; i < dtb.Rows.Count; i++)
{
if (Convert.ToInt32(dtb.Rows[i][0]) == goodsId)
{
DataRow oldDR;
oldDR = dtb.Rows[i];
oldDR["TheCount"] = Int32.Parse(oldDR["TheCount"].ToString()) + 1;
oldDR["thePrice"] = thePrice;oldDR["TotalPrice"] = thePrice * Int32.Parse(oldDR["TheCount"].ToString());
}
else
{
DataRow dRow = dtb.NewRow();
dRow["goodsId"] = goodsId;
dRow["thtGoodsName"] = theGoodsName;
dRow["thePrice"] = thePrice;
dRow["TheCount"] = 1;
dRow["TotalPrice"] = thePrice;
dtb.Rows.Add(dRow);
}
Session["myCar"] = dtb;
}
}
Response.Redirect("myCar.aspx");
}
请大家帮我看看。急用!protected void BtnAddToCar_Click(object sender, EventArgs e)
{
int goodsId = Int32.Parse(this.DetailsView1.Rows[0].Cells[1].Text);
string theGoodsName = (this.DetailsView1.Rows[1].Cells[1].Text).ToString();
decimal thePrice = Convert.ToDecimal(this.DetailsView1.Rows[5].Cells[1].Text);//DataTable dtb = Session["myCar"] as DataTable;if (Session["myCar"] == null)
{
DataTable dtb = new DataTable();
dtb.Columns.Add("goodsId", typeof(int));
dtb.Columns.Add("thtGoodsName");
dtb.Columns.Add("thePrice");
dtb.Columns.Add("TheCount");
dtb.Columns.Add("TotalPrice");
DataRow dRow = dtb.NewRow();
dRow["goodsId"] = goodsId;
dRow["thtGoodsName"] = theGoodsName;
dRow["thePrice"] = thePrice;
dRow["TheCount"] = 1;
dRow["TotalPrice"] = thePrice;
dtb.Rows.Add(dRow);
Session["myCar"] = dtb;}else
{
DataTable dtb = Session["myCar"] as DataTable;
for (int i = 0; i < dtb.Rows.Count; i++)
{
if (Convert.ToInt32(dtb.Rows[i][0]) == goodsId)
{
DataRow oldDR;
oldDR = dtb.Rows[i];
oldDR["TheCount"] = Int32.Parse(oldDR["TheCount"].ToString()) + 1;
oldDR["thePrice"] = thePrice;oldDR["TotalPrice"] = thePrice * Int32.Parse(oldDR["TheCount"].ToString());
}
else
{
DataRow dRow = dtb.NewRow();
dRow["goodsId"] = goodsId;
dRow["thtGoodsName"] = theGoodsName;
dRow["thePrice"] = thePrice;
dRow["TheCount"] = 1;
dRow["TotalPrice"] = thePrice;
dtb.Rows.Add(dRow);
}
Session["myCar"] = dtb;
}
}
Response.Redirect("myCar.aspx");
}
else if ((i+1)==dtb.Rows.Count)
{
DataRow dRow = dtb.NewRow();
dRow["goodsId"] = goodsId;
dRow["thtGoodsName"] = theGoodsName;
dRow["thePrice"] = thePrice;
dRow["TheCount"] = 1;
dRow["TotalPrice"] = thePrice;
dtb.Rows.Add(dRow);
}
}
Session["myCar"] = dtb;
}
非常感谢 ezhuyin(碧海蓝天) 现在问题解决了! DataTable dtb = Session["myCar"] as DataTable;
bool isInCart = false;
for (int i = 0; i < dtb.Rows.Count; i++)
{
if (Convert.ToInt32(dtb.Rows[i][0]) == goodsId)
{
DataRow oldDR;
oldDR = dtb.Rows[i];
oldDR["TheCount"] = Int32.Parse(oldDR["TheCount"].ToString()) + 1;
//oldDR["thePrice"] = thePrice;
oldDR["TotalPrice"] = thePrice * Int32.Parse(oldDR["TheCount"].ToString()); isInCart = true;
break;
}
}
if (!isInCart)
{
DataRow dRow = dtb.NewRow();
dRow["goodsId"] = goodsId;
dRow["thtGoodsName"] = theGoodsName;
dRow["thePrice"] = thePrice;
dRow["TheCount"] = 1;
dRow["TotalPrice"] = thePrice;
dtb.Rows.Add(dRow);
}
Session["myCar"] = dtb;这个问题现在解决了。我还要用myCart.ASPX 页面将数据显示出来,并再GRVIDVIEW 中显示修改 数量和 删除按钮。还需要您的帮忙。谢谢!
protected void btnUpdateCart_Click(object sender, EventArgs e)
{
DataTable dtb = (DataTable)Session["myCar"];
foreach (GridViewRow grw in this.GridView2.Rows)
{int i = grw.RowIndex;
TextBox TheGoodsCount = (TextBox)grw.FindControl("txtCount");int theCount = Int32.Parse(TheGoodsCount.Text);DataRow UpdateDR;
UpdateDR = dtb.Rows[i];
Decimal thePrice = Convert.ToDecimal(dtb.Rows[i]["thePrice"]);
UpdateDR["TheCount"] = theCount;
UpdateDR["TotalPrice"] = thePrice * theCount;Session["myCar"] = dtb;
<Columns>
<asp:BoundField DataField="EmployeeID" HeaderText="Employee ID" ReadOnly="true"/>
<asp:BoundField DataField="FirstName" HeaderText="First Name"/>
<asp:BoundField DataField="LastName" HeaderText="Last Name"/>
<asp:TemplateField HeaderText="Birth Date">
<ItemTemplate>
<asp:Label ID="BirthDateLabel" Runat="Server"
Text='<%# Eval("BirthDate", "{0:d}") %>' />
</ItemTemplate>
<EditItemTemplate>
<asp:Calendar ID="EditBirthDateCalendar" Runat="Server"
VisibleDate='<%# Eval("BirthDate") %>'
SelectedDate='<%# Bind("BirthDate") %>' />
</EditItemTemplate>
</asp:TemplateField>
</Columns>贴出来看看才知道。
Width="540px">
<Columns>
<asp:BoundField DataField="Id" HeaderText="序号" />
<asp:BoundField DataField="goodsId" HeaderText="商品ID" />
<asp:BoundField DataField="thtGoodsName" HeaderText="商品名称" />
<asp:BoundField DataField="thePrice" HeaderText="单价" />
<asp:TemplateField HeaderText="数量">
<ItemTemplate>
<asp:TextBox ID="txtCount" runat="server" Text='<%# Eval("TheCount") %>' Width="91px" EnableViewState="False"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="TotalPrice" HeaderText="单项总价" />
<asp:TemplateField HeaderText="删除">
<ItemTemplate>
<asp:Button ID="btnDelTheGoods" runat="server" CommandArgument='<%# Eval("goodsId") %>'
Text="删除" Width="59px" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID="btnUpdateCart" runat="server" OnClick="btnUpdateCart_Click" Text="更新购物车" />
{
DataTable dtb = (DataTable)Session["myCar"];foreach (GridViewRow grw in this.GridView2.Rows)
{int i = grw.RowIndex;int theCount = Convert.ToInt32(((TextBox)this.GridView2.Rows[i].Cells[4].FindControl("txtCount")).Text.ToString());DataRow UpdateDR;
UpdateDR = dtb.Rows[i];
Decimal thePrice = Convert.ToDecimal(dtb.Rows[i]["thePrice"]);
UpdateDR["TheCount"] = theCount;
//oldDR["thePrice"] = thePrice;
UpdateDR["TotalPrice"] = thePrice * theCount;
Session["myCar"] = dtb;
Context.Server.Transfer(Request.CurrentExecutionFilePath);}
}以下是: aspx 页面代码:<asp:GridView ID="GridView2" runat="server" AutoGenerateColumns="False" Height="205px"
Width="540px">
<Columns>
<asp:BoundField DataField="Id" HeaderText="序号" />
<asp:BoundField DataField="goodsId" HeaderText="商品ID" />
<asp:BoundField DataField="thtGoodsName" HeaderText="商品名称" />
<asp:BoundField DataField="thePrice" HeaderText="单价" />
<asp:TemplateField HeaderText="数量">
<ItemTemplate>
<asp:TextBox ID="txtCount" runat="server" Text='<%# Eval("TheCount") %>' Width="91px" EnableViewState="False"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="TotalPrice" HeaderText="单项总价" />
<asp:TemplateField HeaderText="删除">
<ItemTemplate>
<asp:Button ID="btnDelTheGoods" runat="server" CommandArgument='<%# Eval("goodsId") %>'
Text="删除" Width="59px" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:Button ID="btnUpdateCart" runat="server" OnClick="btnUpdateCart_Click" Text="更新购物车" />
购物车的结构如下:dtb.Columns.Add("Id", typeof(Int32));
dtb.Columns[0].AutoIncrement = true;
dtb.Columns[0].AutoIncrementSeed = 1;
dtb.Columns.Add("goodsId", typeof(Int32));
dtb.Columns.Add("thtGoodsName");
dtb.Columns.Add("thePrice");
dtb.Columns.Add("TheCount");
dtb.Columns.Add("TotalPrice");
<ItemTemplate>
<asp:TextBox ID="txtCount" runat="server" Text='<%# Eval("TheCount") %>' Width="91px" EnableViewState="False"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="TotalPrice" HeaderText="单项总价" />
<asp:TemplateField HeaderText="删除">
<ItemTemplate>
问题就在这里,ItemTemplate字段里面的似乎是无法被读到的,它只是作为一个"template"(模版)而存在。
int theCount = Convert.ToInt32(((TextBox)this.GridView2.Rows[i].Cells[4].FindControl("txtCount")).Text.ToString());
改为
int theCount = int.Parse(grw.Cells[4].Text);
int theCount = int.Parse(((TextBox)grw.FindControl("txtCount")).Text);