2012-03-22 102 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

回答