堆栈溢出异常
我有一个System.Windows.Forms.Treeview
控制与复选框构建权限树,节点动态构建从数据库记录连同从代码Allow Add
,Allow Delete
,Allow Update
后面的代码添加的自定义节点。堆栈溢出异常
问题是当我尝试从树中检索校验节点时,我得到一个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;
}
我想通了为什么我得到了StackOverFlow异常,问题不是在递归调用它的方法,而是在返回时,我返回每次调用方法时获取的数据列表,所以List items已达到他们大幅双打一分,所以我所做的就是简单的==>我做的方法返回类型为Void不是列表[因为我将填补这一列表(这是在类范围内声明)
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);
}
}
}
你有一个递归调用在这里:
if (aNode.Nodes.Count > 0)
{
_JobPermissions.AddRange(SaveCheckedPermissions(_JobID, aNode.Nodes));
}
检查是否已通过调试器下运行递归前减少节点数目。
我认为,如果全部节点检查在一个特定的水平,它将无限递归。
[编辑]
它可能只是因为节点级别太多。在崩溃之前它会得到多少级别的递归?你可以使用Debug.WriteLines来测试它吗?
那么我使用递归调用遍历通过子节点当前节点,否则我只会得到根节点,并且我还会检查计数是否(aNode.Nodes.Count> 0)以知道当前节点是否有子节点。 – user2139774 2013-03-19 15:33:21
代码相当复杂,所以我认为唯一能够发现是怎么回事的方法是在调试器中单步执行。 – 2013-03-19 15:37:34
我想我解决了递归问题,我会尽快发布解决方案:) – user2139774 2013-03-19 17:30:54
任何机会对于同一个节点在树中出现多次?每个节点是否有一些唯一的标识符? – 2013-03-19 15:32:03
看看你是否在做http://msdn.microsoft.com/en-us/library/wwc698z7.aspx – TalentTuner 2013-03-19 15:43:02
@ShadowWizard每个节点都有一个唯一的名字 – user2139774 2013-03-19 16:36:14