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

时间:2023-03-09 22:29:02
C#  关于变量使用范围容易犯错的问题(TreeView数据绑定为例)

asp.net做一个treeview数据绑定

绑定子节点时查询出来的数据正确,但在进行数据绑定时一直索引溢出

然后调试 ... 调试 ... 再调试...

依然很崩溃  想到了是变量定义后面共用后的问题,然而并没有改到点上

最后发现问题: 就是 new TreeNode 是在整个绑定外部,在逐级绑定时,这个node没有被重新初始化,还是我刚刚添加上去的node。

错误示范:

 //加载子节点
protected void tree_TreeNodePopulate(object sender, TreeNodeEventArgs e)
{
DataTable dt = myGetDataTable();//从数据库中获取数据(需自定义)
if (dt != null && dt.Rows.Count > )
{
int depth = e.Node.Depth;
DataView dv = dt.DefaultView;
TreeNode node = new TreeNode();//就是这里错了 if (depth == )//
{
DataTable dtItem = dv.ToTable(true, "省");
string limit = string.Format("省 = '{0}'", txt_s.Text);
DataRow[] drs_pc = dtItem.Select(limit);
foreach (DataRow dr in drs_pc)
{
node.Text = dr["省"].ToString();
node.Value = dr["省"].ToString();
node.SelectAction = TreeNodeSelectAction.SelectExpand;
node.Expanded = true;
node.PopulateOnDemand = true;
node.ToggleExpandState();
e.Node.ChildNodes.Add(node);
}
}
else if (depth == )
{
DataTable dtItem = dv.ToTable(true, "省", "市");
string limit = string.Format("省 = '{0}' AND 市 = '{0}' ", txt_s.Text, txt_s2.Text);
DataRow[] drs_type = dtItem.Select(limit);
foreach (DataRow dr in drs_type)
{
node.Text = dr["市"].ToString();
node.Value = dr["市"].ToString();
node.SelectAction = TreeNodeSelectAction.SelectExpand;
node.Expanded = true;
node.PopulateOnDemand = true;
node.ToggleExpandState();
e.Node.ChildNodes.Add(node);
}
}
}
}

(这只是一个示例,主要想记住这个问题)

不仅是这一种情况会引起因共用变量而出现的问题,还有当new 一个类时,如果使用类的同一个属性或字段,在前面已经给这个属性或字段赋值,后面使用时未进行重新赋值,则这个属性或字段的值是前一次的值,而不是当前需要的值(未重新new 这个类的情况下)。

还有很多类似或出现bug的情况,以后需要注意。