2012-03-22 141 views
0

我得到了這個樹視圖,我讓它選擇所有的孩子,如果父母被選中,回來的路上。還有另一個規則來檢查一些受撫養的孩子。問題是:我想檢查父母是否有任何孩子被選中,但是因爲那些其他規則我找不到這樣做的方式沒有規則會發生衝突。所以這裏是我的代碼做了到現在爲止:提前檢查父母如果孩子檢查

private void tvMorgan_AfterCheck(object sender, TreeViewEventArgs e) 
    { 
     //Check Children if parent checked 
     if (e.Node.Nodes.Count > 0) 
     { 
      TreeNode tnParent = e.Node; 
      if (tnParent.Checked) 
      { 
       foreach (TreeNode tnChild in tnParent.Nodes) 
       { 
        tnChild.Checked = true; 
       } 
      } 
      //Unchecked children if parent unchecked 
      else 
      { 
       foreach (TreeNode tnChild in tnParent.Nodes) 
       { 
        tnChild.Checked = false; 
       } 
      } 
     } 
     //If dependent node is selected, check the other two 
     else if (((e.Node.Text.Contains("BRL/EUR")) && (e.Node.Checked)) && (e.Node.Parent.Text.Contains("FWD"))) 
     { 
      TreeNode tnParent = e.Node.Parent; 

      foreach (TreeNode tn in tnParent.Nodes) 
      { 
       if (tn.Text.Contains("BRL/USD") || tn.Text.Contains("EUR/USD")) 
        tn.Checked = true; 
      } 
     } 
     //If one of the two necessary nodes are uncheked, then uncheck the dependent one 
     else if ((((e.Node.Text.Contains("BRL/USD")) || (e.Node.Text.Contains("EUR/USD"))) && (!e.Node.Checked)) && (e.Node.Parent.Text.Contains("FWD"))) 
     { 
      TreeNode tnParent = e.Node.Parent; 

      foreach (TreeNode tn in tnParent.Nodes) 
      { 
       if (tn.Text.Contains("BRL/EUR")) 
        tn.Checked = false; 
      } 
     } 
    } 

感謝

+1

是,如果你要好得多可以提供您的代碼的一個減少版本隔離問題。代替我會提到你可能想要在方法開始時禁用事件處理程序AfterCheck,並在最後重新啓用它。這將禁用當前方法的遞歸方面。 – Slugart 2012-03-22 19:24:47

+0

另外,我會將父子自動選擇的邏輯(根據問題)從更硬的編碼規則中分離出來 – payo 2012-03-22 19:26:09

回答