Ошибка InvalidOperationException - PullRequest
       11

Ошибка InvalidOperationException

4 голосов
/ 30 декабря 2011

Я создаю метод для обработки события кнопки удаления внутри DataList, и он выполняет функции должным образом, однако я получаю это исключение:

Collection was modified; enumeration operation may not execute.

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Collection was modified; enumeration operation may not execute.

, и это мой код:

protected void delete(object sender, CommandEventArgs e) 
        {
            if ((e.CommandName == "delete") && (e.CommandArgument != null))
            {
                foreach (DataListItem item in DataList2.Items)
                {
                    Label post_IDLabel = (Label)item.FindControl("post_IDLabel");
                    string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString();
                    SqlConnection conn = new SqlConnection(connStr);
                    SqlCommand cmd = new SqlCommand("delete_post", conn);
                    cmd.CommandType = CommandType.StoredProcedure;
                    int post_ID = Convert.ToInt32(post_IDLabel.Text);
                    string email = Session["email"].ToString();
                    int course_ID = Convert.ToInt32(Request.QueryString["courseID"]);
                    cmd.Parameters.Add(new SqlParameter("@course_ID", course_ID));
                    cmd.Parameters.Add(new SqlParameter("@myemail", email));
                    cmd.Parameters.Add(new SqlParameter("@post_ID", post_ID));
                    conn.Open();
                    cmd.ExecuteNonQuery();
                    conn.Close();
                    DataList2.DataBind();
                }
            }

Ответы [ 3 ]

2 голосов
/ 30 декабря 2011

Вы не можете изменять коллекцию во время ее перечисления.DataList2.DataBind изменяет DataList2.Items, что недопустимо.

Если вы переместите DataBind за пределы цикла, оно должно работать.

2 голосов
/ 30 декабря 2011

Возьмите DataList2.DataBind(); из цикла foreach

            foreach (DataListItem item in DataList2.Items)
            {
                Label post_IDLabel = (Label)item.FindControl("post_IDLabel");
                string connStr = ConfigurationManager.ConnectionStrings["MyDbConn"].ToString();
                SqlConnection conn = new SqlConnection(connStr);
                SqlCommand cmd = new SqlCommand("delete_post", conn);
                cmd.CommandType = CommandType.StoredProcedure;
                int post_ID = Convert.ToInt32(post_IDLabel.Text);
                string email = Session["email"].ToString();
                int course_ID = Convert.ToInt32(Request.QueryString["courseID"]);
                cmd.Parameters.Add(new SqlParameter("@course_ID", course_ID));
                cmd.Parameters.Add(new SqlParameter("@myemail", email));
                cmd.Parameters.Add(new SqlParameter("@post_ID", post_ID));
                conn.Open();
                cmd.ExecuteNonQuery();
                conn.Close();
            }
            DataList2.DataBind();
1 голос
/ 30 декабря 2011

Я полагаю, что ваша проблема решается, когда вы перемещаете DataList2.DataBind из foreach.

Но я думаю, что в вашем коде есть больше ошибок, вам следует избегать вызова базы данных из цикла.Вы должны попытаться изменить этот код, чтобы сделать только один вызов в базу данных.Например, передайте все идентификаторы сообщений в одном параметре.Или, может быть, только course_id и email, если этого достаточно.

...