我有一个带有复选框的System.Windows.Forms.Treeview
控件来构建权限树,这些节点是从数据库记录动态构建的,还有从Allow Add
,Allow Delete
后面的代码添加的自定义节点,{ {1}}。
问题是当我尝试从树中检索校验节点时,我得到Allow Update
。
这是我的代码:
StackOverflowException
答案 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);
}
}
}