4

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

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(); 
       } 
      } 
+1

Возможно, переносите данные из цикла. –

+0

Вы привязываетесь к DataList в вашем цикле foreach, что приводит к изменению коллекции. – Tim

ответ

2

Возьмите 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(); 
2

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

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

1

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

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

+0

спасибо большое Тим, это сработало, но я не получил информацию об идентификаторе сообщения? не могли бы вы объяснить больше, пожалуйста? :) –

+0

хороший вопрос :-) вы можете найти более подробную информацию здесь: http://stackoverflow.com/questions/43249/t-sql-stored-procedure-that-accepts-multiple-id-values ​​ –

+0

Идея в том, что вы передать в id как список хранимой процедуры –

Смежные вопросы