0

Can someone explain to me how to add DataGridViewComboBoxCell to dataGridView? Code is something like this:

 foreach(....){

 DataGridViewComboBoxCell cmb = new DataGridViewComboBoxCell();
//cmb.item.add(....

dataGridView.Rows.Add(new object[] {cmb,name,surname});   } 

First cell in grid is type of DataGridViewComboBoxColumn, I tried with changing cmb to DataGridViewComboBoxColumn and still nothing.

I handeld DataError so i dont get "value is not valid" error, but my comboboxes in datagridview are empty.

JollyRoger
  • 19
  • 1
  • 1
  • 4

4 Answers4

1

Ok, I solved the problem. It seems that you have to add values to cells step by step.

I'm going to give general explanation because it seems that a loot of people have problem with this. Let's say you have DataGridView with 3 columns, DataGridViewTextBoxCell, DataGridViewComboBoxColumn, DataGridViewCheckBoxCell in that order. Now, YOU HAVE to make make this three columns using Desinger or otherwise it wont work.

So now you want to add specific values to grid, each row representing lets say a person. In designer it looks like

          Name  PhoneNumberS   Married
  ..*.. |.....|..............|.........|.... 

So you want to add his name to textboxcell, list of phonenumbers to comboboxcell and to check checkboxcell if his married. And to repeat for each person you have in your list.

Here is pseudocode:

 foreach(Person p in people.getAll()){

/////MAKE NEW CELL FOR EACH VALUE
 DataGridViewTextBoxCell name= new DataGridViewTextBoxCell();
 name.Value = p.name;

 DataGridViewTextBoxCell phones= new DataGridViewTextBoxCell();

 foreach(Int Pnumber in p.numbers){
    phones.items.add(Pnumber);
  }

  DataGridViewCheckBoxCell ismarried = new DataGridViewCheckBoxCell();
         ismarried.Value = p.married;

 ///////// MAKE NEW ROW AND ADD CELLS
 DataGridViewRow row = new DataGridViewRow();
  row .Cells.Add(name);
  row .Cells.Add(phones);
  row .Cells.Add(ismarried );

   ///// ADD ENTIRE ROW TO DATA GRID
   dataGridView.Rows.Add(row);
   }

Just to repeat, you FIRST HAVE TO ADD COLUMNS TO GRID USING DESIGNER and when you add cells to row in code it HAS TO BE IN EXACLY SAME ORDER AS SEEN IN DESIGNER.

JollyRoger
  • 19
  • 1
  • 1
  • 4
1

There are different approaches on how to solve this problem. I post this answer because I was dealing with a similar situation and found a decent solution. A DataGridView must be placed on your formular, the rest (in this example) is done in code. First of all we start with our DataSource for the DataGridView.

    DataTable myData = new DataTable();
    myDataGridView.AutoGenerateColumns = false;

It´s important to turn off the auto generation, so we can set up the columns as we want. Now add some data to our DataTable . In this example cats:

    myData.Columns.Add("Name", typeof(string));
    myData.Columns.Add("Gender", typeof(string));

    myData.Rows.Add(new object[] {"Ser Pounce", "male"});
    myData.Rows.Add(new object[] {"Fluffy", "male"});
    myData.Rows.Add(new object[] {"Peach", "female"});

After we have specified the Data and its columns we can create the specific columns in our DataGridView.

     DataGridViewTextBoxColumn nameColumn = new DataGridViewTextBoxColumn();
     nameColumn.HeaderText = "Cat name";
     nameColumn.DataPropertyName = "Name"; 
     nameColumn.ReadOnly = true;

     DataGridViewComboBoxColumn genderColumn = new DataGridViewComboBoxColumn ();
     List<string> genderList = new List<string>() { "male", "female", "unknown" };
     genderColumn.DataSource = genderList;
     genderColumn.HeaderText = "Gender";
     genderColumn.DataPropertyName = "Gender";
     genderColumn.ValueType = typeof(string);

     myDataGridView.DataSource = myData;
     myDataGridView.Columns.AddRange(nameColumn, genderColumn);

Add our Data as DataSource for the DataGridView before adding the defined columns. Note that the DataPropertyName of each column (DataGridView) has to be the same as the name we gave the columns in our DataTable. HeaderText can be named differently. Lastly match the ValueType of the column and data.

Henning
  • 26
  • 6
0

I think that you want to add a column of type DataGridViewComboBoxColumn.

DataGridViewComboBoxColumn d = new DataGridViewComboBoxColumn();
        d.Name = "Drinks";
        d.Items.Add("Coca-Cola");
        d.Items.Add("Sprite");

        dataGridView1.Columns.Add(d);

I hope it will help.

Edis
  • 256
  • 2
  • 4
  • Yeah, i tried with DataGridViewComboBoxColumn and still got nothing. – JollyRoger Jun 01 '14 at 11:08
  • No, combobox in grid is still empty. I'm trying something with DataGridViewComboBoxColumn cmb = ((DataGridViewComboBoxColumn)l.dataGridView1.Columns["Column1"]); but it sets all combobox items with same items – JollyRoger Jun 01 '14 at 11:28
  • Read this article. http://www.telerik.com/forums/how-to-dynamically-add-datagridviewcomboboxcell-in-telerik-gridviews It's telerik component, but it is almost the same. Hope it will be helpful. – Edis Jun 01 '14 at 11:33
0

I encountered kind of similar issue,

DataGridViewComboBoxCell value is not valid.

The combobox works fine in the first run, and when I change the value in one of the comboboxes (which is outside of the grid), changing that, should bind the new set of data to the datagrid based on the parameter. But it throws the error at second run.

This is what worked for me:

foreach (var p in realmPos)
{  
    clmRealmPosition.Items.Add(p.RealmPosition);
}

I replaced above code with:

clmRealmPosition.DataSource = realmPos.Select(s => s.RealmPosition).ToList();

Note: clmRealmPosition is the Design name for the combobox column. And also it's good to have an ErrorEvent as well.

Jeremy Caney
  • 7,102
  • 69
  • 48
  • 77
sangeetha
  • 1
  • 1