asp.net做一个treeview数据绑定
绑定子节点时查询出来的数据正确,但在进行数据绑定时一直索引溢出
然后调试 ... 调试 ... 再调试...
依然很崩溃 想到了是变量定义后面共用后的问题,然而并没有改到点上
最后发现问题: 就是 new TreeNode 是在整个绑定外部,在逐级绑定时,这个node没有被重新初始化,还是我刚刚添加上去的node。
错误示范:
1 //加载子节点 2 protected void tree_TreeNodePopulate(object sender, TreeNodeEventArgs e) 3 { 4 DataTable dt = myGetDataTable();//从数据库中获取数据(需自定义) 5 if (dt != null && dt.Rows.Count > 0) 6 { 7 int depth = e.Node.Depth; 8 DataView dv = dt.DefaultView; 9 TreeNode node = new TreeNode();//就是这里错了 10 11 if (depth == 0)// 12 { 13 DataTable dtItem = dv.ToTable(true, "省"); 14 string limit = string.Format("省 = '{0}'", txt_s.Text); 15 DataRow[] drs_pc = dtItem.Select(limit); 16 foreach (DataRow dr in drs_pc) 17 { 18 node.Text = dr["省"].ToString(); 19 node.Value = dr["省"].ToString(); 20 node.SelectAction = TreeNodeSelectAction.SelectExpand; 21 node.Expanded = true; 22 node.PopulateOnDemand = true; 23 node.ToggleExpandState(); 24 e.Node.ChildNodes.Add(node); 25 } 26 } 27 else if (depth == 1) 28 { 29 DataTable dtItem = dv.ToTable(true, "省", "市"); 30 string limit = string.Format("省 = '{0}' AND 市 = '{0}' ", txt_s.Text, txt_s2.Text); 31 DataRow[] drs_type = dtItem.Select(limit); 32 foreach (DataRow dr in drs_type) 33 { 34 node.Text = dr["市"].ToString(); 35 node.Value = dr["市"].ToString(); 36 node.SelectAction = TreeNodeSelectAction.SelectExpand; 37 node.Expanded = true; 38 node.PopulateOnDemand = true; 39 node.ToggleExpandState(); 40 e.Node.ChildNodes.Add(node); 41 } 42 } 43 } 44 }
(这只是一个示例,主要想记住这个问题)
不仅是这一种情况会引起因共用变量而出现的问题,还有当new 一个类时,如果使用类的同一个属性或字段,在前面已经给这个属性或字段赋值,后面使用时未进行重新赋值,则这个属性或字段的值是前一次的值,而不是当前需要的值(未重新new 这个类的情况下)。
还有很多类似或出现bug的情况,以后需要注意。