title: InvalidOperationException - When ending editing a cell & moving to another cell
body: <p>I made a program in which I wanted to manually update the Data Grid View.
  -I have a Method to Refresh the DGV by clearing it and then reinserting the data.
  -Using the designer, I made an event handler for the DGV's CellEndEdit. Inside the Event Handler, the data gets updated &amp; the DGV's custom refreshing method is called.</p>
  
  <p>While running the program, whenever I start editing a cell &amp; end it by selecting another one,  an exception is thrown:</p>
  
  <p>InvalidOperationException
  Operation is not valid because it results in a reentrant call to the SetCurrentCellAddressCore function.</p>
  
  <p>Visual C#'s debugger marks the line that clears the data : datagridview1.Rows.Clear();</p>
  
  <p>If you'd like to reproduce the problem, Make a new windows form project with visual c#, put a DataGridView object on the form, and paste the following code for the Form1.cs:</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.ComponentModel;
  using System.Data;
  using System.Drawing;
  using System.Linq;
  using System.Text;
  using System.Windows.Forms;
  
  namespace Error___DataGridView_Updating___Cell_endedit
  {
      public partial class Form1 : Form
      {
          // Objects
          DataTable dt;
          DataColumn colID;
          DataColumn colName;
          DataColumn colInfo;
          // Constructor
          public Form1()
          {
              InitializeComponent();
  
              Initialize_dt();
              InsertSampleData_dt();
              Initialize_dataGridView1();
          }
  
          // Methods
          private void Initialize_dt()
          {
              dt = new DataTable();
  
              // Building Columns
              // ID
              colID = new DataColumn();
              colID.ColumnName = "ID";
              colID.DataType = typeof(int);
              dt.Columns.Add(colID);
  
              // Name
              colName = new DataColumn();
              colName.ColumnName = "Name";
              colName.DataType = typeof(string);
              dt.Columns.Add(colName);
  
              //Info
              colInfo = new DataColumn();
              colInfo.ColumnName = "Info";
              colInfo.DataType = typeof(string);
              dt.Columns.Add(colInfo);
          }
  
          private void InsertSampleData_dt()
          {            
              DataRow row; 
  
              // 0
              row = dt.NewRow();
              row["ID"] = 100;
              row["Name"] = "AAAA";
              row["Info"] = "First Record";
              dt.Rows.Add(row);
  
              //1
              row = dt.NewRow();
              row["ID"] = 101;
              row["Name"] = "BBBB";
              row["Info"] = "Second Record";
              dt.Rows.Add(row);
  
  
              //2
              row = dt.NewRow();
              row["ID"] = 102;
              row["Name"] = "CCCC";
              row["Info"] = "Third Record";
              dt.Rows.Add(row);
          }
  
          private void Initialize_dataGridView1()
          {
              dataGridView1.AllowUserToAddRows = false;
  
              // Data Grid Definitions
              //      Row Header
  
              dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.DisableResizing;
              dataGridView1.RowHeadersWidthSizeMode = DataGridViewRowHeadersWidthSizeMode.AutoSizeToAllHeaders;
              //      ColumnHeaders
              dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;
  
              // Building Columns
              #region ID
              {
                  DataGridViewColumn colSGID = new DataGridViewTextBoxColumn();
                  colSGID.Name = "ID";
                  colSGID.HeaderText = "#";
                  colSGID.ReadOnly = true;
                  colSGID.Visible = false;
                  colSGID.Resizable = DataGridViewTriState.False;
  
                  dataGridView1.Columns.Add(colSGID);
              }
              #endregion
  
              #region Name
              {
                  DataGridViewColumn colSGName = new DataGridViewTextBoxColumn();
                  colSGName.Name = "Name";
                  colSGName.HeaderText = "Name";
  
                  dataGridView1.Columns.Add(colSGName);
              }
              #endregion
  
              #region Info
              {
                  DataGridViewColumn colSGSubject = new DataGridViewTextBoxColumn();
                  colSGSubject.Name = "Info";
                  colSGSubject.HeaderText = "Description";
  
                  dataGridView1.Columns.Add(colSGSubject);
              }
              #endregion
  
              Refresh_dataGridView1();
          }
  
          private void Refresh_dataGridView1()
          {
              int index;
  
              dataGridView1.SuspendLayout();
  
              dataGridView1.Rows.Clear();
  
              //MessageBox.Show("Cleared Data. Rebuilding...");
  
              foreach (DataRow row in dt.Rows)
              {
                  index = dataGridView1.Rows.Add(new DataGridViewRow());
  
                  dataGridView1.Rows[index].Cells["ID"].Value = row["ID"];
                  dataGridView1.Rows[index].Cells["Name"].Value = row["Name"];
                  dataGridView1.Rows[index].Cells["Info"].Value = row["Info"];
  
                  //MessageBox.Show("row #" + index);
              }
  
              dataGridView1.ResumeLayout();
          }
  
          //Event Handlers
          private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
          {
              bool toUpdate = false;
  
              int id = (int)dataGridView1.Rows[e.RowIndex].Cells["ID"].Value;
              string columnName = dataGridView1.Columns[e.ColumnIndex].Name;
              string value = (string)dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Value;
  
              if (value == null)
              {
                  value = string.Empty;
              }
  
              switch (columnName)
              {
                  case "Name":
                      if (value == string.Empty)
                      {
                          MessageBox.Show("Name Can't Be Empty!");
                      }
                      else
                      {
                          toUpdate = true;
                      }
                      break;
                  case "Info":
                      toUpdate = true;
                      break;
              }
  
              if (toUpdate)
              {
                  foreach(DataRow row in dt.Rows)
                  {
                      if ( (int)row["ID"] == id)
                      {
                          row[columnName] = value;
                      }
                  }
  
                  Refresh_dataGridView1();
              }
  
          }
      }
  }
  </code></pre>