读书人

高手帮小弟我看一下这个问什么说“集

发布时间: 2012-02-11 09:51:35 作者: rapoo

高手帮我看一下这个,问什么说“集合已修改;枚举操作可能无法执行”?
调试的时候显示“集合已修改;枚举操作可能无法执行”,问题出在//------根据父节点及父节点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);

}

读书人网 >C#

热点推荐