while (reader.Read())
                {
                    treeSetA[i] = new treeNodesDB();
                    treeSetA[i].nodeClass = "son";
                    treeSetA[i].nodeName = reader.GetString(1);
                    treeSetA[i].nodeLevel = reader.GetInt32(5);
                    treeSetA[i].fatherNode = reader.GetString(3);
                    treeSetA[i].nodeExplain = reader.GetString(4);
                    i++;
                }
这个代码在第一次循环时所填充的数据是没错的。但第二次开始就会把当前节点和之前已经填充好的节点数据又重新用新的数据填充了。
像第一个节点时 treeSetA[0].nodeName 值是“管理中心的”,当第二个循环时treeSetA[1].nodeName和treeSetA[0].nodeName 里的值全都变成了“第一分组”了。请高手指点。

解决方案 »

  1.   

    你的treeSetA是怎么定义的?之后进行了什么操作?应该是保存节点的时候出现问题
      

  2.   

    你这个treeSetA[i]每次循环都new,上一次的都没有保存。
    应该写个List或者什么的               List<treeNodesDB> saveList = new List<treeNodesDB>();
                   while (reader.Read())
                    {
                        treeNodesDB treeSetA = new treeNodesDB();
                        treeSetA .nodeClass = "son";
                        treeSetA .nodeName = reader.GetString(1);
                        treeSetA.nodeLevel = reader.GetInt32(5);
                        treeSetA.fatherNode = reader.GetString(3);
                        treeSetA.nodeExplain = reader.GetString(4);
                        i++;
                        saveList.Add(treeSetA);
                    }
      

  3.   

    这个我是先定义了一个类型treeNodesDB。然后想以这个类型为元素创建一个数组。。
    之前的定义是这样滴。。 treeSetA = new treeNodesDB[nodeConstant];
      

  4.   

    把这句:treeSetA[i] = new treeNodesDB();
    移出while以外,试一下
      

  5.   

    移出while以外?每个元素的treeNodesDB类型不用创建?我刚试了下。好像移出真不行。。一定要new元素才行。
      

  6.   

    整理补充一下。我这个是方法体的引用数组。。在方法参数那里声明数组:
    out treeNodesDB[] treeSetA
    创建数组:
    treeSetA = new treeNodesDB[nodeConstant];
    循环内再创建元素类型和赋值
                    while (reader.Read())
                    {
                        treeSetA[i] = new treeNodesDB();
                        treeSetA[i].nodeClass = "son";
                        treeSetA[i].nodeName = reader.GetString(1);
                        treeSetA[i].nodeLevel = reader.GetInt32(5);
                        treeSetA[i].fatherNode = reader.GetString(3);
                        treeSetA[i].nodeExplain = reader.GetString(4);
                        i++;
                    }
      

  7.   

    既然创建了treeSetA = new treeNodesDB[nodeConstant];为何还要treeSetA[i] = new treeNodesDB();把这句去掉,直接赋值就行了。
      

  8.   


    这可不行。。因为未实例化元素的话是无法赋值滴
    treeSetA = new treeNodesDB[nodeConstant];这句话是声明。。而
    treeSetA[i] = new treeNodesDB();
    才是实例化类型了,如果不用这步编译是会出错滴
      

  9.   

    代码看着没问题,新建一个单独的项目调一下,这种情况只有一步一步慢慢调了;或者别用数组,用List试一下
      

  10.   

    用List试了一下。同样的问题。。第一次循环时填充了[0]第二次循环到[1]时[0]跟[1]的数据都会更新到最新拿到的一条数据
      

  11.   

    你只赋值,没有ADD,所以复盖。
      

  12.   

    ??那个i不是每次循环都i++了吗?数组都指向新的元素了还要ADD?
      

  13.   

    你的这些代码反映不出问题的所在,除非,你得到数据库的记录都是相同的的,你可以
    while (reader.Read())
    {
        //打印出 reader.GetString(1)看是否是相同的
        treeSetA[i] = new treeNodesDB();
        treeSetA[i].nodeClass = "son";
        treeSetA[i].nodeName = reader.GetString(1);
        treeSetA[i].nodeLevel = reader.GetInt32(5);
        treeSetA[i].fatherNode = reader.GetString(3);
        treeSetA[i].nodeExplain = reader.GetString(4);
        i++;
    }
    如果reader.Read()出来的内容都是不同的,那么,是不会出现你的问题的。测试代码  public class treeNodesDB
      {
        public String nodeClass { set; get; }
        public String nodeName { set; get; }
        public String nodeLevel { set; get; }
        public String fatherNode { set; get; }
        public String nodeExplain { set; get; }
      }
      
      //winform测试可以改成Button_click事件
      protected void Page_Load(object sender, EventArgs e)
      {
        int i = 0;
        treeNodesDB[] treeSetA = new treeNodesDB[10];
        while (i < 10)
        {
          treeSetA[i] = new treeNodesDB();
          treeSetA[i].nodeClass = "son";
          treeSetA[i].nodeName = "A" + i.ToString();
          treeSetA[i].nodeLevel = "B" + i.ToString();
          treeSetA[i].fatherNode = "C" + i.ToString();
          treeSetA[i].nodeExplain = "D" + i.ToString();
          i++;
        }    for (i = 0; i < treeSetA.Length; i++)
        {
          //输出内容
          Response.Write("<li>" + treeSetA[i].nodeName);
        }
      }
      
      

  14.   

    这个。。我Read出来的数据绝对没问题的。。我试调的时候跟踪过数据了。。每次Read的时候数据都跟我的数据表一行行在变动着。。现在的问题就是比如循环数组走到[2]时会把上两次也就是[0]跟[1]里面元素的值一并修改成最新Read的数据。我一直想不明白这个。。
      

  15.   

    我想说的是这是个自定义类型的数组每个数组的元素如果不用new的话哪来有分配内存给这元素?再说吧2楼的朋友说的那招我也试了下。。用List也发现了同样的问题。。
      

  16.   

    不知道你还在等什么,测试的例子都给你发出来了,既然Read出来的内容没有问题,那就不是
    OleDbDataReader类读数据库
    的问题了。那就去找你的treeNodesDB的定义的问题或者你使用 treeNodesDB[] 的地方有问题,这不是很明显的道理吗?你要学会分析和调试,而不是在这里等,说了半天了,你都没有贴出你的代码,神仙也帮不了你啊。拷贝14楼的代码测试,如果你的treeNodesDB定义是那样的,是不会有问题的。