title: Cell Formatting In DataGridView On DataBindingComplete
body: <p>I am having problems with a requirement on one of my projects at work.  What I am doing is binding a datatable to a DataGridView(DGV)'s datasource.  I then loop through the DataGridView and check if the cell as either 1 * or 2 ** in its value and format those cells with a tooltip and a red background.  If I use a button event to trigger this everything works perfectly fine.  But if I want this to occur automatically when the form loads using the DataBindingComplete event it does not work correctly.  The problem was DataBindingComplete was firing multiple times.  I read <a href="https://stackoverflow.com/questions/828505/databindingcomplete-is-getting-called-multiple-times">this SO question</a> which gave me a couple options to try and none worked.  Here is the code:</p>
  
  <pre><code>public partial class TestForm2 : Form
  {
      private DataTable dt;
      private int methodCalls = 0;
      private bool isFormatted = false;
  
      public TestForm2()
      {
          InitializeComponent();
          buildDataTable();
          dataGridView1.DataBindingComplete += dataGridView1_DataBindingComplete;
      }
  
      private void TestForm2_Load(object sender, EventArgs e)
      {
          bindData();
      }
  
      private void button1_Click(object sender, EventArgs e)
      {
          formatDataGridView();
      }
  
      private void bindData()
      {
          dataGridView1.DataSource = dt;
      }
  
      private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
      {
          //If this code is commented out the program will work just fine 
          //by just clicking the button
  
          //This was added to prevent formatDataGridView from executing more
          //than once.  Even though I unreg and rereg the event handler, the 
          //method was still being called 3 - 4 times. This successfully
          //prevented that but only the *'s were removed and no red back color
          //added to the cells.
          if(!isFormatted)
          {
              formatDataGridView();
          }
      }
  
      private void buildDataTable()
      {
          dt = new DataTable();
  
          dt.Columns.Add("col1");
          dt.Columns.Add("col2");
          dt.Columns.Add("col3");
          dt.Columns.Add("col4");
          Random randNum = new Random();
          for(int i = 0; i &lt; 10; i++)
          {
              DataRow dr;
              object[] rowItems = new object[dt.Columns.Count];
  
              for(int j = 0; j &lt; dt.Columns.Count; j++)
              {
                  int number = randNum.Next(1, 20);
  
                  if(number % 7 == 0)
                  {
                      rowItems[j] = number + "*";
                  }
                  else if(number % 5 == 0)
                  {
                      rowItems[j] = number + "**";
                  }
                  else
                  {
                      rowItems[j] = number;
                  }
              }
  
              dr = dt.NewRow();
              dr.ItemArray = rowItems;
              dt.Rows.Add(dr);
          }
      }
  
      private void formatDataGridView()
      {
          // I noticed that I needed to unregister the event handler to 
          // prevent DataBindingComplete from firing during the format
          dataGridView1.DataBindingComplete -= dataGridView1_DataBindingComplete;
          foreach(DataGridViewRow row in dataGridView1.Rows)
          {
              string originalCell;
              string reformattedCell;
  
              if(row.Cells["col1"].Value != null)
              {
                  originalCell = row.Cells["col1"].Value.ToString();
  
                  if (originalCell.Count(c =&gt; c == '*') == 2)
                  {
                      reformattedCell = originalCell.Replace("**", "");
  
                      row.Cells["col1"].Value = reformattedCell;
                      row.Cells["col1"].Style.BackColor = Color.Red;
                      row.Cells["col1"].ToolTipText = "Divisible by 5";
                  }
  
                  else if (originalCell.Count(c =&gt; c == '*') == 1)
                  {
                      reformattedCell = originalCell.Replace("*", "");
  
                      row.Cells["col1"].Value = reformattedCell;
                      row.Cells["col1"].Style.BackColor = Color.Red;
                      row.Cells["col1"].ToolTipText = "Divisible by 7";
                  }
  
                  else
                  {
                      //do nothing
                  }
              }
  
              if (row.Cells["col2"].Value != null)
              {
                  originalCell = row.Cells["col2"].Value.ToString();
  
                  if (originalCell.Count(c =&gt; c == '*') == 2)
                  {
                      reformattedCell = originalCell.Replace("**", "");
  
                      row.Cells["col2"].Value = reformattedCell;
                      row.Cells["col2"].Style.BackColor = Color.Red;
                      row.Cells["col2"].ToolTipText = "Divisible by 5";
                  }
  
                  if (originalCell.Count(c =&gt; c == '*') == 1)
                  {
                      reformattedCell = originalCell.Replace("*", "");
  
                      row.Cells["col2"].Value = reformattedCell;
                      row.Cells["col2"].Style.BackColor = Color.Red;
                      row.Cells["col2"].ToolTipText = "Divisible by 7";
                  }
  
                  else
                  {
                      //do nothing
                  }
              }
  
              if (row.Cells["col3"].Value != null)
              {
                  originalCell = row.Cells["col3"].Value.ToString();
  
                  if (originalCell.Count(c =&gt; c == '*') == 2)
                  {
                      reformattedCell = originalCell.Replace("**", "");
  
                      row.Cells["col3"].Value = reformattedCell;
                      row.Cells["col3"].Style.BackColor = Color.Red;
                      row.Cells["col3"].ToolTipText = "Divisible by 5";
                  }
  
                  else if (originalCell.Count(c =&gt; c == '*') == 1)
                  {
                      reformattedCell = originalCell.Replace("*", "");
  
                      row.Cells["col3"].Value = reformattedCell;
                      row.Cells["col3"].Style.BackColor = Color.Red;
                      row.Cells["col3"].ToolTipText = "Divisible by 7";
                  }
  
                  else
                  {
                      //do nothing
                  }
              }
  
              if (row.Cells["col4"].Value != null)
              {
                  originalCell = row.Cells["col4"].Value.ToString();
  
                  if (originalCell.Count(c =&gt; c == '*') == 2)
                  {
                      reformattedCell = originalCell.Replace("**", "");
  
                      row.Cells["col4"].Value = reformattedCell;
                      row.Cells["col4"].Style.BackColor = Color.Red;
                      row.Cells["col4"].ToolTipText = "Divisible by 5";
                  }
  
                  else if (originalCell.Count(c =&gt; c == '*') == 1)
                  {
                      reformattedCell = originalCell.Replace("*", "");
  
                      row.Cells["col4"].Value = reformattedCell;
                      row.Cells["col4"].Style.BackColor = Color.Red;
                      row.Cells["col4"].ToolTipText = "Divisible by 7";
                  }
  
                  else
                  {
                      //do nothing
                  }
              }
          }
          // Reregistering the event handler
          dataGridView1.DataBindingComplete += dataGridView1_DataBindingComplete;
          isFormatted = true;
          methodCalls++;
          MessageBox.Show("Method Calls: " + methodCalls);
      }
  }
  </code></pre>
  
  <p>I am not sure how to get around this problem but there has to be a way.  I am unfamiliar with DataBindingComplete until recently so I am sure to learn something here.  Thanks for the help everyone and helping me learn something new!</p>