堆栈溢出异常

时间:2013-03-19 15:25:03

标签: c# treeview

我有一个带有复选框的System.Windows.Forms.Treeview控件来构建权限树,这些节点是从数据库记录动态构建的,还有从Allow AddAllow Delete后面的代码添加的自定义节点,{ {1}}。

问题是当我尝试从树中检索校验节点时,我得到Allow Update

这是我的代码:

StackOverflowException

2 个答案:

答案 0 :(得分:1)

这里有一个递归调用:

if (aNode.Nodes.Count > 0)
{
    _JobPermissions.AddRange(SaveCheckedPermissions(_JobID, aNode.Nodes));
}

通过在调试器下运行来检查是否减少了递归之前的节点数。

我认为如果 all 在特定级别检查节点,它将无限递归。

[编辑]

可能只是节点级别太多了。在崩溃之前它会获得多少级别的递归?你可以使用Debug.WriteLines吗?

答案 1 :(得分:1)

我弄清楚为什么我得到StackOverFlow异常,问题不在于递归调用方法它在返回时,我返回了每次调用方法时获取的数据列表,因此List项目达到了他们大幅翻倍的地方,所以我做的很简单==>我使方法返回类型Void不是列表[因为我将填充该List(在类范围中声明)

void SaveCheckedPermissions(int _JobID, System.Windows.Forms.TreeNode RootNode)
{
    using (WFMDBEntities _DBContext = new WFMDBEntities())
    {
        tbl_JobPermission _JopPermissionHelperVar;

        foreach (System.Windows.Forms.TreeNode aNode in RootNode.Nodes)
        {
            if (aNode.Checked == true)
            {
                int _tempJobPermID;
                int.TryParse(aNode.Name, out _tempJobPermID);
                _JopPermissionHelperVar = new tbl_JobPermission();
                _JopPermissionHelperVar.Tbljob = _JobID;
                if (aNode.Name.Contains('_'))
                {
                    int _tempSpecialJobPermID;
                    int.TryParse(aNode.Parent.Name, out _tempSpecialJobPermID);
                    if (_JobPermissions.Where(x => x.TblPremition == _tempSpecialJobPermID).FirstOrDefault() != null)
                    {
                        _JobPermissions.Where(x => x.TblPremition == _tempSpecialJobPermID).FirstOrDefault().TblPremition = _tempSpecialJobPermID;
                        if (aNode.Name.ToLower().Contains("add"))
                        {
                            _JobPermissions.Where(x => x.TblPremition == _tempSpecialJobPermID).FirstOrDefault().AllowNew = true;
                        }
                        else if (aNode.Name.ToLower().Contains("update"))
                        {
                            _JobPermissions.Where(x => x.TblPremition == _tempSpecialJobPermID).FirstOrDefault().AllowUpdate = true;
                        }
                        else if (aNode.Name.ToLower().Contains("delete"))
                        {
                            _JobPermissions.Where(x => x.TblPremition == _tempSpecialJobPermID).FirstOrDefault().AllowDelete = true;
                        }
                    }
                }
                else
                {
                    if (_JobPermissions.Where(x => x.TblPremition == _tempJobPermID).FirstOrDefault() == null)
                    {
                        _JopPermissionHelperVar.TblPremition = _tempJobPermID;
                    }

                }

                if (_JobPermissions.Where(x => x.TblPremition == _JopPermissionHelperVar.TblPremition && x.Tbljob == _JopPermissionHelperVar.Tbljob).ToList().Count < 1)
                {
                    _JobPermissions.Add(_JopPermissionHelperVar);
                }
            }
            SaveCheckedPermissions(_JobID, aNode);
        }
    }
}