帮忙看下这个循环哪里出错了?谢谢了。
我做的是一个购物车,用table做临时存储的。
可是我这种循环,table中的数据越来越多,不过都是重复的。。。希望各位大哥大姐给看下。
代码如下:
else
{//如果购物车存在,就遍历table中的spID 看有没有是已经存在table中的
DataTable dt=(DataTable)Session[ "bus "];
int spID= Convert.ToInt32(this.DataGrid1.DataKeys[e.Item.ItemIndex].ToString());
for(int i=0;i < Convert.ToInt32(dt.Rows.Count.ToString());i++)
{
if (Convert.ToInt32(dt.Rows[i][ "spID "])==spID)
{
dt.Rows[i][ "数量 "]=Convert.ToInt32(dt.Rows[i][ "数量 "])+1;
double total= Convert.ToDouble(dt.Rows[i][ "jiage "])*Convert.ToDouble(dt.Rows[i][ "数量 "]);
dt.Rows[i][ "总价 "]=total;
}
else
{ int r =Convert.ToInt32(dt.Rows.Count.ToString());
SqlConnection conn = DB.CreatCon();
conn.Open();
SqlCommand cmd1 = new SqlCommand( "select * from sptable where spID= ' "+spID+ " ' ",conn);
SqlDataAdapter sda1 = new SqlDataAdapter();
DataSet ds1 = new DataSet();
sda1.SelectCommand=cmd1;
sda1.Fill(ds1, "sptable1 ");
DataRow dr = dt.NewRow();
dr.ItemArray = ds1.Tables[ "sptable1 "].Rows[0].ItemArray;
dt.Rows.Add(dr);
dt.Rows[r][ "数量 "]=1;
dt.Rows[r][ "总价 "]=Convert.ToDecimal(dt.Rows[r][ "jiage "]);
}
}//for循环
Session[ "bus "]=dt;
}//第一个else的
------解决方案--------------------这个写法,很新鲜
for(int i=0;i < Convert.ToInt32(dt.Rows.Count.ToString());i++)
为何不写成
for(int i=0;i <dt.Rows.Count;i++)
还不知这一个,所有本来是数字类型的,都经过 数字-> 字符串-> 数字 的转换。
------解决方案--------------------这样写重复数据当然会越来越多了,你的思路本身就是有问题的,按你的代码,购物车内有两种商品,现在加入第三种商品,与前两种商品都不同,那么会比较两次,每一次都会加入一条第三种商品的数据,dt.Rows.Count值越大,重复数据就越多
在数据库中建立一个临时表,记录购物车中的商品数据,每加入一种商品,去该表中查询,如果已存在,则数量加1,不存在,新增一条记录
------解决方案--------------------购物车一般多会创建一个 和datatable一样的dataview
然后用这个 dataview去操作。
像你那里就不需要用
for(int i=0;i < Convert.ToInt32(dt.Rows.Count.ToString());i++)
{
if (Convert.ToInt32(dt.Rows[i][ "spID "])==spID)
去比较了
dataview.Find() 方法直接给你返回包不包含
------解决方案--------------------DataView CartView = new DataView(dt);
CartView.Sort = "spID ";
int i;
i = CartView.Find(spID);
if (i ==-1 )
{
//不存在
DataRow myDv = Cart.NewRow();