2011-09-13 19 views
6

我有一个父级和子级节点的树视图控件,每个节点都有一个复选框,用于在选择后选择节点,如果我单击删除按钮我想要删除孩子或家长所选择的,我使用以下代码,并返回一个错误删除选定的父节点和子节点 - 集合已被修改;枚举操作可能不会执行

代码

protected void btnRemoveOrganisation_Click(object sender, EventArgs e) 
    { 

     foreach (TreeNode Item in tvwSelectedOrganisations.CheckedNodes) 
     { 

      if (Item.Parent == null) 
      { 
       foreach (TreeNode ChildNode in Item.ChildNodes) 
       { 
        Item.ChildNodes.Remove(ChildNode); 
       } 

       tvwSelectedOrganisations.Nodes.Remove(Item); 
      } 
      else 
      { 
       Item.Parent.ChildNodes.Remove(Item); 
      } 

     } 

    } 

错误

集合已修改;枚举操作可能不会执行。

修改后的代码

 protected void btnRemoveOrganisation_Click(object sender, EventArgs e) 
     { 
      TreeNodeCollection SelectedNodes = tvwSelectedOrganisations.CheckedNodes; 

      foreach (TreeNode Item in SelectedNodes) 
      { 

       if (Item.Parent == null) 
       { 
        tvwSelectedOrganisations.Nodes.Remove(Item); 
       } 
       else 
       { 
        tvwSelectedOrganisations.FindNode(Item.Parent.ValuePath).ChildNodes.Remove(Item); 

       } 

       if (SelectedNodes.Count == 0) 
       { 
        break; 
       } 

      } 

     } 

解决方案

int SelectedCount = SelectedNodes.Count; 

      for (int i = SelectedCount - 1; i >= 0; i--) 
      { 

       if (tvwSelectedOrganisations.CheckedNodes[i].Parent == null) 
       { 
        int j = tvwSelectedOrganisations.CheckedNodes[i].ChildNodes.Count; 
        tvwSelectedOrganisations.Nodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); 
        i += j; 
       } 
       else 
       { 
        tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ShowCheckBox = false; 
        tvwSelectedOrganisations.FindNode(tvwSelectedOrganisations.CheckedNodes[i].Parent.ValuePath).ChildNodes.Remove(tvwSelectedOrganisations.CheckedNodes[i]); 

       } 

      } 
+0

发现解决方案,问题是由于通用列表正在使用,我已经用正确的代码更新了帖子 – sudheshna

回答

4

希望你使用.net 3.5或更高版本。

foreach (TreeNode ChildNode in Item.ChildNodes.ToList()) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 

编辑

如果Item.ChildNodes不Enumerable。然后尝试下面。

for(int i = Item.ChildNodes.Count - 1; i >= 0; i--) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 

或者

while (Item.ChildNodes.Count > 0) 
{ 
    Item.ChildNodes.Remove(ChildNode); 
} 
+0

,但是当我更改foreach循环时,它显示构建错误“Error 'System.Web.UI.WebControls.TreeNodeCollection'不包含'ToList'的定义,并且没有找到接受'System.Web.UI.WebControls.TreeNodeCollection'类型的第一个参数的扩展方法'ToList' (你是否缺少使用指令或程序集引用?)“ – sudheshna

+0

刚添加更多选项。 – CharithJ

+0

嗨Charith,我已经尝试了for循环,它的工作原理,更新了正确的解决方案。谢谢 – sudheshna

2

你不能在foreach内这一行,因为你改变你列举的集合:

tvwSelectedOrganisations.Nodes.Remove(Item); 

取而代之的是,建立一个要删除的项目的新列表,然后遍历该列表并删除现有的foreach之外(以及之后)的项目。

+0

SpikeX和Kalyan,我试过这个,我不是为什么它从我的新集合中删除相同的项目,我也已修改我的帖子以包含我的新代码。另外,如果我尝试删除单个节点或单个节点中的项目,它将起作用,但是如果在多个节点中选择项目,它会使用框架4引发相同的异常 – sudheshna

1

肯定地说,它会抛出异常。您不应该通过在同一个集合中循环来在集合中将deleteremove中的项目组合起来。而是将集合Item.ChildNodes复制到一个空的新集合,尝试在原始集合中循环,并在循环超出循环范围之后,在新集合中删除想要的项目,然后将修改后的集合重新分配给原始集合。

相关问题