2013-03-19 119 views
1

我有一個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; 
} 
+1

任何機會對於同一個節點在樹中出現多次?每個節點是否有一些唯一的標識符? – 2013-03-19 15:32:03

+0

看看你是否在做http://msdn.microsoft.com/en-us/library/wwc698z7.aspx – TalentTuner 2013-03-19 15:43:02

+0

@ShadowWizard每個節點都有一個唯一的名字 – user2139774 2013-03-19 16:36:14

回答

1

我想通了爲什麼我得到了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); 
     } 
    } 
} 
1

你有一個遞歸調用在這裏:

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

檢查是否已通過調試器下運行遞歸前減少節點數目。

我認爲,如果全部節點檢查在一個特定的水平,它將無限遞歸。

[編輯]

它可能只是因爲節點級別太多。在崩潰之前它會得到多少級別的遞歸?你可以使用Debug.WriteLines來測試它嗎?

+1

那麼我使用遞歸調用遍歷通過子節點當前節點,否則我只會得到根節點,並且我還會檢查計數是否(aNode.Nodes.Count> 0)以知道當前節點是否有子節點。 – user2139774 2013-03-19 15:33:21

+0

代碼相當複雜,所以我認爲唯一能夠發現是怎麼回事的方法是在調試器中單步執行。 – 2013-03-19 15:37:34

+1

我想我解決了遞歸問題,我會盡快發佈解決方案:) – user2139774 2013-03-19 17:30:54