首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

高手帮小弟我看一下这个,问什么说“集合已修改;枚举操作可能无法执行”

2012-02-11 
高手帮我看一下这个,问什么说“集合已修改;枚举操作可能无法执行”?调试的时候显示“集合已修改;枚举操作可能

高手帮我看一下这个,问什么说“集合已修改;枚举操作可能无法执行”?
调试的时候显示“集合已修改;枚举操作可能无法执行”,问题出在//------根据父节点及父节点id,显示所有子结点------下“foreach   (DataRow   Dr   in   Ds.Tables[ "tempTable "].Rows)”代码中,是什么原因造成的,需要怎么处理?

代码如下:
using   System;
using   System.Collections.Generic;
using   System.ComponentModel;
using   System.Data;
using   System.Drawing;
using   System.Text;
using   System.Windows.Forms;
using   System.Data.SqlClient;

namespace   mysystem
{
        public   partial   class   SystemFrm   :   Form
        {
                public   DataSet   Ds   =   new   DataSet();
                public   SystemFrm()
                {
                        InitializeComponent();
                }

                //------初始SysTemFrm------
                private   void   SystemFrm_Load(object   sender,   EventArgs   e)
                {
                        InitTree(-1);
                }

                //------绑定personlist到personlist_TreeView,显示系统用户树形跟目录------
                private   void   InitTree(int   rootid)
                {
                        LinkDatabase( "select   *   from   personlist   where   parent_id= "   +   rootid);
                        foreach   (DataRow   Dr   in   Ds.Tables[ "tempTable "].Rows)
                        {
                                int   id;
                                id   =   (int)Dr[ "id "];
                                TreeNode   rootNode   =   new   TreeNode();
                                rootNode.Text   =   Dr[ "name "].ToString();
                                rootNode.Tag   =   id;
                                personlist_TreeView.Nodes.Add(rootNode);
                                CreateChildNodes(rootNode,   id);
                        }
                }

                //------根据父节点及父节点id,显示所有子结点------


                private   void   CreateChildNodes(TreeNode   parentNode,int   parentid)
                {
                        LinkDatabase( "select   *   from   personlist   where   parent_id= "   +   parentid);
                        foreach   (DataRow   Dr   in   Ds.Tables[ "tempTable "].Rows)
                        {
                                int   id;
                                id   =   (int)Dr[ "id "];
                                TreeNode   childNode   =   new   TreeNode();
                                childNode.Text   =   Dr[ "name "].ToString();
                                childNode.Tag   =   id;
                                parentNode.Nodes.Add(childNode);
                                CreateChildNodes(childNode,   id);
                        }
                }

                //------连接到数据库返回DataSet------
                private   DataSet   LinkDatabase(string   strCommandText)
                {
                        SqlConnection   Conn   =   new   SqlConnection( "server=localhost;database=mysystem;uid=sa;pwd=sa ");
                        SqlCommand   Cmd   =   Conn.CreateCommand();
                        Cmd.CommandText   =   strCommandText;
                        SqlDataAdapter   Da   =   new   SqlDataAdapter(Cmd);
                        Conn.Open();
                        Ds.Clear();
                        Da.Fill(Ds, "tempTable ");
                        Conn.Close();
                        return   Ds;
                }
        }
}

[解决办法]
把foreach循环改为for循环



foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。
[解决办法]
MSDN:
foreach 语句为数组或对象集合中的每个元素重复一个嵌入语句组。foreach 语句用于循环访问集合以获取所需信息,但不应用于更改集合内容以避免产生不可预知的副作用。

try..

foreach (DataRow Dr in Ds.Tables[ "tempTable "].Rows)
-> >
for(int i=0;i <Ds.Tables[ "tempTable "].Rows.Count;i++)
{
DataRow Dr=Ds.Tables[ "tempTable "].Rows[i];
int id;
id = (int)Dr[ "id "];
TreeNode childNode = new TreeNode();
childNode.Text = Dr[ "name "].ToString();
childNode.Tag = id;
parentNode.Nodes.Add(childNode);
CreateChildNodes(childNode, id);

}

热点排行