c# - 堆栈溢出异常

标签 c# treeview

我有一个 System.Windows.Forms.Treeview 控件,其中带有用于构建权限树的复选框,节点是从数据库记录动态构建的,以及从代码后面添加的自定义节点 Allow添加允许删除允许更新

问题是当我尝试从树中检索检查节点时,我得到一个 StackOverflowException

这是我的代码:

List<tbl_JobPermission> SaveCheckedPermissions(int _JobID, System.Windows.Forms.TreeNodeCollection theNodes)
{
    using (WFMDBEntities _DBContext = new WFMDBEntities())
    {
        tbl_JobPermission _JopPermissionHelperVar;
        if (theNodes.Count > 0)
        {
            foreach (System.Windows.Forms.TreeNode aNode in theNodes.OfType<System.Windows.Forms.TreeNode>().Where(x => x.Checked == true))
            {
                int _tempJobPermID = int.Parse(aNode.Parent.Name);
                if (aNode.Name.Contains('_'))
                {
                    _JopPermissionHelperVar =
                            new tbl_JobPermission()
                            {
                                TblPremition = _tempJobPermID,
                                Tbljob = _JobID
                            };
                    if (aNode.Name.ToLower().Contains("add"))
                    {
                        _JopPermissionHelperVar.AllowNew = true;
                    }
                    else if (aNode.Name.ToLower().Contains("update"))
                    {
                        _JopPermissionHelperVar.AllowUpdate = true;
                    }
                    else if (aNode.Name.ToLower().Contains("delete"))
                    {
                        _JopPermissionHelperVar.AllowDelete = true;
                    }

                    if (!_JobPermissions.Contains(_JopPermissionHelperVar))
                    {
                        _JobPermissions.Add(_JopPermissionHelperVar);
                    }
                }
                else
                {
                    _JopPermissionHelperVar =
                            new tbl_JobPermission()
                            {
                                TblPremition = int.Parse(aNode.Name),
                                Tbljob = _JobID
                            };
                    if (!_JobPermissions.Contains(_JopPermissionHelperVar))
                    {
                        _JobPermissions.Add(_JopPermissionHelperVar);
                    }
                }
                if (aNode.Nodes.Count > 0)
                {
                    _JobPermissions.AddRange(SaveCheckedPermissions(_JobID, aNode.Nodes));
                }
            }
        }
    }
    return _JobPermissions;
}

最佳答案

这里有一个递归调用:

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

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

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

[编辑]

可能只是节点级别太多。在崩溃之前它会递归到多少级?你能用 Debug.WriteLines 来检测它吗?

关于c# - 堆栈溢出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15503566/

相关文章:

c# - 在 TreeView 中禁用选择

c# - Kinect SDK 1.7 |更改 KinectCursor 图像和大小

c# - 写入多于一行的 xml

c# - 异步等待调用后的 Console.WriteLine。

c# - 您如何使用可以是多种类型的变量?

c# - 如何防止 ASP.NET 事件的 HTTP GET?或如何检查所有事件的 Request.Type?

c# - 将 TreeView 的内容保存到文件并稍后加载

WPF:组合框中的 TreeView

c# - C#中的递归和匿名方法