想把一个datatable myda中的数据逐行读取到另一个datatable myda_copy中进行排序,每次都将myda的第一行读取到myda_copy的最后一行,并删除myda的第一行,myda的第二行变成myda的第一行。
我自己写了一下代码,总是出错,循环一次后在索引0处没有数据了,请问各位高手这个问题该如何解决?
代码如下:DataSet myDs = new DataSet();
SqlDataAdapter myDa;
myDa.Fill(myDs,"myDa");
myDa.Fill(myDs, "myDa_Copy");
myDs.Tables["myDa_Copy"].Clear();
...
for (int c = b; c < b + (int)parent_count[a]; c++)
                            {
                                myDs.Tables["myDa_Copy"].Rows.Add(myDs.Tables["myDa"].Rows[0].ItemArray);
                                myDs.Tables["myDa"].Rows[0].Delete();
                            }
...

解决方案 »

  1.   

    你不会就一条数据吧
    myDs.Tables["myDa"].Rows[0].AcceptChanges()
      

  2.   

    while(myDs.rows.count > 0)
    {
        myDs_copy.add(myDs[0].clone);
        myDs.removeat(0);
    }只是个大概写法~
      

  3.   

    如果循环中有牵涉到删除行操作的话,建议从Table最大行开始循环到第一行,这样就不会出现数组下标溢出的错误了
      

  4.   

    lz的意思是把 myda的数据逐条的添加到myda_copy中吗  ?比如 
    myda:
    a b
    1 2
    3 4
    5 6myda_copy
    a b
    1 2
    3 4
    5 6
    ??
      

  5.   


    DataTable dt = new DataTable();
                DataTable dt2 = new DataTable();
                dt2 = dt.Clone();
    你这么做是达到什么目的呢?与我上面的代码有区别吗?
      

  6.   

     myDs.Tables["myDa"].Rows[0][0].toString()
    好像是这样吧?
      

  7.   

    不好意思,没仔细看LZ的意思,原来他是为了反转表里的行集。下面这样应该可以。DataTable dt = new DataTable();
                DataTable dt2 = dt.Clone();
                dt2.Rows.Clear();            for (int i = dt.Rows.Count - 1; i >= 0; i++)
                {
                    dt2.Rows.Add(dt.Rows[i]);
                }
      

  8.   

    不过如果只是想排序,还有更好的办法,不用这么笨。直接在表上建立视图,然后对视图排序,过滤都行。
    DataView dv = new DataView(dt);
                dv.Sort = "F1,F2,F3";
      

  9.   

    protected void Page_Load(object sender, EventArgs e)
            {
                DataTable myda = new DataTable();
                myda.Columns.Add("ID");
                myda.Columns.Add("Name");
                for (int i = 0; i < 10; i++)
                {
                    DataRow dr = myda.NewRow();
                    dr[0] = i;
                    dr[1] = "Name" + i;
                    myda.Rows.Add(dr);
                }
                DataTable myda_copy = new DataTable();
                myda_copy = myda.Clone();//复制架构
                while (myda.Rows.Count > 0)
                {
                    DataRow dr = myda.Rows[0];
                    myda_copy.Rows.Add(dr.ItemArray);
                    myda.Rows.Remove(dr);
                }
                GridView1.DataSource = myda_copy;
                GridView1.DataBind();
            }手写了一个,看楼主受不受用
      

  10.   

    顺手写了一个复制的,如果楼主想要倒序的话,方法有很多。这里随便改改吧:while (myda.Rows.Count > 0)
                {
                    DataRow dr = myda.Rows[myda.Rows.Count -1];
                    myda_copy.Rows.Add(dr.ItemArray);
                    myda.Rows.Remove(dr);
                } 就可以反序了
      

  11.   

    你这个好像是把一个dataTable追加到另一个dataTable后面
    你要保证两个表的具有相同的字段,以及一样的约束条件
      

  12.   

    其实直接一个循环就可以了
    如dataTable1追加到dataTable2后面:
    foreach(DataRow dr in dataTable1.rows)
    {dataTable2.rows.Add(dr);}
      

  13.   

    DataSet myDs = new DataSet();
    SqlDataAdapter myDa;
    myDa.Fill(myDs,"myDa");
    DataTable dt2 = myDs.Tables["myDa"].Clone();
    for (int c = b; c < b + (int)parent_count[a]; c++)
    {
        dt2.Rows.Add(myDs.Tables["myDa"].Rows[0].ItemArray);
        myDs.Tables["myDa"].Rows[0].Delete();
    }
    可能红色部分计算错误,楼主把全部代码贴出来。
      

  14.   

    这个排序并不是为了反转排序,而是一个特定序列的排序,所以要一个个读取myDa中的行。我还是把排序的所有代码都贴出来吧
      

  15.   

    你不如直接将DataTable1循环遍历就是了,何必那么麻烦呢?
      

  16.   

    需要对一个节点的序列按照节点类型排序,如果节点类型为Router,则把这个Router节点放到节点序列的中间位置。                for (int i = 0; i <= (aveheight); i++, beginheight += averageheight)
                    {
                        str01 = "select count(*) from Node_Information where cur_depth=" + i + "";
                        cmd.CommandText = str01;
                        int count = (int)cmd.ExecuteScalar();
                        int avecount = this.width / (count + 1);
                        beginwidth = avecount;
                        for (int j = 1; j <= count; j++, beginwidth += avecount)
                        {
                            //获取当前层中所有节点的父节点信息
                            cmd_two.CommandText = "select parent_short,count(*) from node_information where cur_depth=" + i + " group by parent_short order by parent_short";
                            dr = cmd_two.ExecuteReader();
                            while (dr.Read())
                            {
                                parent_count.Add(dr.GetInt32(1));
                                parent_mac.Add(dr.GetString(0));
                            }
                            dr.Close();
                            //获取当前层的所有节点
                            cmd_two.CommandText = "select cur_short,cur_nodetype,cur_depth,parent_short,ax,ay,cur_mac,mac_address,location from Node_Information where cur_depth=" + i + " order by parent_short,cur_short";
                            StringFormat format = new StringFormat();
                            format.Alignment = StringAlignment.Center;
                            format.LineAlignment = StringAlignment.Center;
                            myDa = new SqlDataAdapter(cmd_two.CommandText, sql);
                            myDa.Fill(myDs,"myDa");
                            myDa.Fill(myDs, "myDa_Copy");
                            myDs.Tables["myDa_Copy"].Clear();
                            //对节点进行排序,将路由节点放在中间位置。注意:同一层节点中的父节点不止一个。
                            for (int a = 0; a < parent_mac.Count; a++)
                            {
                                for (int c = b; c < b + (int)parent_count[a]; c++)
                                {
                                    myDs.Tables["myDa_Copy"].Rows.Add(myDs.Tables["myDa"].Rows[0].ItemArray);
                                    myDs.Tables["myDa"].Rows[0].Delete();
                                }
                                for (int 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();
                                        router_count++;
                                    }
                                }
                                if (router_count != 0)
                                {
                                    f = ((int)parent_count[a] - router_count) / 2 + router_count;
                                    for (int e = f; e < (int)parent_count[a]; e++)
                                    {
                                        myDs.Tables["myDa_Copy"].Rows.Add(myDs.Tables["myDa_Copy"].Rows[f].ItemArray);
                                        myDs.Tables["myDa_Copy"].Rows[f].Delete();
                                    }
                                    for (int h = 0; h < (int)parent_count[a]; h++)
                                    {
                                        myDs.Tables["myDa"].Rows.Add(myDs.Tables["myDa_Copy"].Rows[0].ItemArray);
                                        myDs.Tables["myDa"].Rows[0].Delete();
                                    }
                                }
                                myDs.Tables["myDa_Copy"].Clear();
                                b = (int)parent_count[a] - 1;
                            }
      

  17.   

    大概就是这个意思,同时删除myda中的数据。