zoukankan      html  css  js  c++  java
  • 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的情况,以后需要注意。

  • 相关阅读:
    C#构造函数
    C#析构函数
    C#常量
    C#属性
    checklistbox的用法
    2012快捷键
    查询ORACLE存储关联表
    UltraDropDown
    Linux常用命令大全(非常全!!!)
    infra 仪表盘效果
  • 原文地址:https://www.cnblogs.com/catherinehu/p/10334798.html
Copyright © 2011-2022 走看看