深爱不及久伴ler

导航

C# 关于变量使用范围容易犯错的问题(TreeView数据绑定为例)

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的情况,以后需要注意。

posted on 2019-01-29 16:57  深爱不及久伴ler  阅读(317)  评论(0编辑  收藏  举报