日期:2014-05-20  浏览次数:21019 次

帮忙看下这个循环哪里出错了?谢谢了。
我做的是一个购物车,用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();