nkgawade 0 Newbie Poster

Hi All,

In my application's DataGridView there are 3 ComboBoxColumns. Out of which two are filled by Enumerator type and one from DataSet.

I set Generic Class object as DataSource to DataGridView. Based on the values in this object I want those ComboBoxColumns values to be selected and relevant DisplayMember has to get displayed.

It works only for 2 ComboBoxColumns which are filled with Enumerator Type. But third combo shows ValueMember as DisplayMember and gives error :

“System.Argument.Exception: DataGridViewComboBoxCell value is not valid”

When handled in DataError event shows DataGridViewDataErrorContexts Formatting | Display errors.

In CellFormattingEvent I have converted all the ComboBoxColumn Values to String type.

I have set AutoSizeColumnsMode to "None". Also tried with setting it to "NotSet" but didn't worked.

After debugging I come to know that when I select value from my first ComboBoxColumn and move to the next cell having another ComboBoxColumn, SelectedValue of first ComboBoxColumn becomes NULL even if Data is available in that column.

Just to test I have added SelectedIndexChanged event to those ComboBoxColumns.

private void dgvContractNote_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
      if (activeCell == 0)
      {
        ComboBox cbType;
        cbType = (ComboBox)e.Control;
        if (cbType != null)
        {
          // Remove an existing event-handler, if present, to avoid 
          // adding multiple handlers when the editing control is reused.
          cbType.SelectedIndexChanged -= new EventHandler(cbType_SelectedIndexChanged);

          cbType.SelectedIndexChanged += new EventHandler(cbType_SelectedIndexChanged);
        }
      }
      else
        if (activeCell == 2)
        {
          ComboBox cbScrip;
          cbScrip = (ComboBox)e.Control;
          if (cbScrip != null)
          {
            cbScrip.SelectedIndexChanged -= new EventHandler(cbScrip_SelectedIndexChanged);
            cbScrip.SelectedIndexChanged += new EventHandler(cbScrip_SelectedIndexChanged);
          }
        }
        else
          if (activeCell == 4)
          {
            ComboBox cbMonth;
            cbMonth = (ComboBox)e.Control;
            if (cbMonth != null)
            {
              cbMonth.SelectedIndexChanged -= new EventHandler(cbMonth_SelectedIndexChanged);
              cbMonth.SelectedIndexChanged += new EventHandler(cbMonth_SelectedIndexChanged);
            }
          }

    }

    private void cbType_SelectedIndexChanged(object sender, EventArgs e)
    {
      ComboBox cbType = (ComboBox)sender;
      if (cbType.SelectedValue == null)
      {
        MessageBox.Show("Error: Type is null");
      }
      else
      {
        MessageBox.Show("SelectedValue is: " + cbType.SelectedValue + " DisplayMember: " + cbType.SelectedItem.ToString());
      }
    }

    private void cbScrip_SelectedIndexChanged(object sender, EventArgs e)
    {
      ComboBox cbScrip = (ComboBox)sender;
      if (cbScrip.SelectedValue == null)
      {
        MessageBox.Show("Error: Type is null");
      }
      else
      {
        MessageBox.Show("SelectedValue is: " + cbScrip.SelectedValue + " DisplayMember: " + cbScrip.SelectedItem.ToString());
      }
    }

 private void cbMonth_SelectedIndexChanged(object sender, EventArgs e)
    {
      ComboBox month = (ComboBox)sender;
      DateTime expDate = DateTime.MinValue;
      PortfolioMis.Business.Date objDate = new PortfolioMis.Business.Date();
      switch (Convert.ToString(month.SelectedItem))
      {
        case "January":
          expDate = objDate.FindExpiryDateOfMonth(1);
          break;
        case "February":
          expDate = objDate.FindExpiryDateOfMonth(2);
          break;
        case "March":
          expDate = objDate.FindExpiryDateOfMonth(3);
          break;
        case "April":
          expDate = objDate.FindExpiryDateOfMonth(4);
          break;
        case "May":
          expDate = objDate.FindExpiryDateOfMonth(5);
          break;
        case "June":
          expDate = objDate.FindExpiryDateOfMonth(6);
          break;
        case "July":
          expDate = objDate.FindExpiryDateOfMonth(7);
          break;
        case "August":
          expDate = objDate.FindExpiryDateOfMonth(8);
          break;
        case "September":
          expDate = objDate.FindExpiryDateOfMonth(9);
          break;
        case "October":
          expDate = objDate.FindExpiryDateOfMonth(10);
          break;
        case "November":
          expDate = objDate.FindExpiryDateOfMonth(11);
          break;
        case "December":
          expDate = objDate.FindExpiryDateOfMonth(12);
          break;
      }

      if (!dgvContractNote.Rows[iRowIndex].IsNewRow)
        dgvContractNote.Rows[iRowIndex].Cells["ExpiryDate"].Value = expDate.ToString("dd/MM/yyyy");

    }

Say ActiveCell = 0. Then cbType_SelectedIndexChanged event is called.

First time it shows "SelectedValue is: BUY DisplayMember: BUY". This is CORRECT.

Now CellLeave to next Cell having ComboBoxColumn. But then again the same event is called cbType_SelectedIndexChanged. This time message is Error: Type is Null.

And then it repeats with different messages. Sometimes Formatting Error, Display Error etc.

How it happens still not understood.

Please help me to resolve this issue.

Regards,
Nandkishore