编写了这样一段读取和移动datatable中的数据行的代码,
但是在“myDs.Tables["myDa_Copy"].Rows.RemoveAt(d);”后增加了一条赋值语句“d = d - 1;”后就陷入死循环,无法输出结果。
请问各位高手这个问题该如何解决                        for (d = 0; d < myDs.Tables["myDa_Copy"].Rows.Count; d++)
                        {
                            if (myDs.Tables["myDa_Copy"].Rows[d]["cur_nodetype"].ToString() == "Router")
                            {
                                myDs.Tables["myDa_Copy"].Rows.Add(myDs.Tables["myDa_Copy"].Rows[d].ItemArray);
                                //myDs.Tables["myDa_Copy"].Rows[d].Delete();
                                myDs.Tables["myDa_Copy"].Rows.RemoveAt(d);
                                router_count++;
                            }
                        }

解决方案 »

  1.   

    d = 0; d < myDs.Tables["myDa_Copy"].Rows.Count; d++然后在里面又写d=d-1;lz你晕了吧?~~
      

  2.   

    但是之前有一个判断语句啊,是不是要重新建立datatable的索引?
      

  3.   

    我是想让插入datarow的语句执行完之后再次读取row[d]
      

  4.   

    晕啊,在没有d++之前又d=d-1,循环体内执行完后又d++,d还是0没有变,更不会跳出循环了
      

  5.   


    int i=myDs.Tables["myDa_Copy"].Rows.Count;// 这句话提出来就好了
     for (d = 0; d < i; d++)
                            {
                                if (myDs.Tables["myDa_Copy"].Rows[d]["cur_nodetype"].ToString() == "Router")
                                {
                                    myDs.Tables["myDa_Copy"].Rows.Add(myDs.Tables["myDa_Copy"].Rows[d].ItemArray);
                                    //myDs.Tables["myDa_Copy"].Rows[d].Delete();
                                    myDs.Tables["myDa_Copy"].Rows.RemoveAt(d);
                                    router_count++;
                                }
                            }
      

  6.   

    myDs.Tables["myDa_Copy"].Rows.RemoveAt(d);//此方法每执行一次,myDs.Tables["myDa_Copy"].Rows.Count值会减1
    如果表有4条记录,也就是说myDs.Tables["myDa_Copy"].Rows.Count=4
    第一次执行,myDs.Tables["myDa_Copy"].Rows.RemoveAt(0)
    执行第一次之后,d=1,myDs.Tables["myDa_Copy"].Rows.Count=3,myDs.Tables["myDa_Copy"].Rows.RemoveAt(1)
    执行第二次之后,d=2,myDs.Tables["myDa_Copy"].Rows.Count=2,myDs.Tables["myDa_Copy"].Rows.RemoveAt(2)
    执行第三次之后,d=3,myDs.Tables["myDa_Copy"].Rows.Count=1,myDs.Tables["myDa_Copy"].Rows.RemoveAt(3)
    ...
      

  7.   

    你d<myDs.Tables["myDa_Copy"].Rows.Count 循环每走这句都会重新计算的,给他当变量提出来就OK了 注意跟踪调试各个变量就可以发现这个问题的
      

  8.   

    for (d = 0; d < myDs.Tables["myDa_Copy"].Rows.Count; d++)
    {
        if (myDs.Tables["myDa_Copy"].Rows[d]["cur_nodetype"].ToString() == "Router")
        {
            myDs.Tables["myDa_Copy"].Rows.Add(myDs.Tables["myDa_Copy"].Rows[d].ItemArray);
            //myDs.Tables["myDa_Copy"].Rows[d].Delete();
            myDs.Tables["myDa_Copy"].Rows.RemoveAt(d);
            if (d < myDs.Tables["myDa_Copy"].Rows.Count - 1)//在这里加判断,防止死循环
                d--;
            router_count++;
        }
    }
      

  9.   

    好的,谢谢!这段代码是封装在一个dll里的,通过别的网页调用它的时候好像没办法跟踪调试。
      

  10.   

    不妨将循环改为
    for (d = myDs.Tables["myDa_Copy"].Rows.Count-1; d >=0; d--)
      

  11.   

    是这样的,你d=d-1了 然后反过去d++ 这样不是d一直处于2两个值之间来回变化么,你看看应该是这么回事导致了你死循环 处理下应该没问题
      

  12.   

    但是d--这句话始终是要加上去的,在对myDs.Tables["myDa_Copy"]进行操作之后必须要在原有行索引的位置停留一次才行。
      

  13.   

    在这之前有一个判断保证不会在每次循环都进入这个if语句中的d=d-1
      

  14.   

    用这个方法可以在停留一次后再读一次myDs.Tables["myDa_Copy"].Rows[d]吗?
      

  15.   

    代码是封装在dll里运行的,好像不能单步走吧。
      

  16.   

    感谢各位的支持,最后在代码中增加了一个datatable类型的数据,采用Merge合并两个datatable完成了排序,避免了d--和d++这种矛盾的代码出现。