0

System.InvalidOperationException: Collection was modified;

private void btnGetUpdatedSchema_Click(object sender, EventArgs e)
{
    lviewMainDbSchema.Items.Clear();

    string conString = null;

    conString = "Data source=" + txtUpdatedServerName.Text + ";Password=" + txtUpdatedPassword.Text + ";Initial Catalog=" + txtUpdatedDatabaseName.Text + ";User ID=" + txtUpdatedUserId.Text + ";";
    con = new SqlConnection(conString);
    try
    {
        int tblTotal = 0;
        GetTables(conString, tblMainList, tblTotal);
        foreach (var list in tblMainList)
        {
            con.Open();
            string query = "SELECT * FROM" + " " + list;
            cmd = new SqlCommand(query, con);
            dr = cmd.ExecuteReader();
            dt = dr.GetSchemaTable();
            con.Close();

            foreach (DataRow dt_row in dt.Rows)
            {
                foreach (DataColumn dt_col in dt.Columns)
                {
                    lviewMainDbSchema.Items.Add(string.Format("{0}={1}", dt_col.ColumnName, dt_row[dt_col]).ToString());

                    //HERE WHERE I GOT THE ERROR!! :) :) :) <3 
                    tblMainList.Add(string.Format("{0}={1}", dt_col.ColumnName, dt_row[dt_col]).ToString());
                }
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show("ERROR!!!!" + ex);
    }
}
  1. List item
Balagurunathan Marimuthu
  • 2,927
  • 4
  • 31
  • 44

2 Answers2

1

You can't modify object of a list that you enumerate by foreach loop. Use for loop intead.

for(int i = 0; i < tblMainList.Count(); i++)
{
      foreach (DataRow dt_row in dt.Rows)
      {
           foreach (DataColumn dt_col in dt.Columns)
           {
               lviewMainDbSchema.Items.Add(string.Format("{0}={1}", dt_col.ColumnName, dt_row[dt_col]).ToString());

               //HERE WHERE I GOT THE ERROR!! :) :) :) <3 
               tblMainList.Add(string.Format("{0}={1}", dt_col.ColumnName, dt_row[dt_col]).ToString());
                }
            }
        }
daniell89
  • 1,832
  • 16
  • 28
0

You could use a separate List<string> to add the new items to and then later add that to the iterated List:

List<string> addItems = new List<string>();
foreach(var list in tblMainList)
{
    con.Open();
    string query = "SELECT * FROM"+" "+list;
    cmd = new SqlCommand(query, con);
    dr = cmd.ExecuteReader();
    dt = dr.GetSchemaTable();
    con.Close();

    foreach (DataRow dt_row in dt.Rows)
    {
         foreach (DataColumn dt_col in dt.Columns)
         {
              lviewMainDbSchema.Items.Add(string.Format("{0}={1}", dt_col.ColumnName, dt_row[dt_col]).ToString());

              //add new items to new list
              addItems .Add(string.Format("{0}={1}", dt_col.ColumnName, dt_row[dt_col]).ToString());
         }
    }
} 

// add new List to tblMainList
tblMainList.AddRange(addItems);
Romano Zumbé
  • 7,893
  • 4
  • 33
  • 55