you can have a different dataSource for each row. I would suggest you to use DataTables - each of them will be for particular row (so combined they can be a set of DataSet).
One example (not using DataSet), but each row has its own dataSource:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
dataGridView1.Columns.Add("col1", "Column1");
DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
comboCol.Name = "cmbColumn";
comboCol.HeaderText = "combobox column";
dataGridView1.Columns.Add(comboCol);
for (int i = 0; i < 10; i++)
{
string text = "item " + i;
int[] data = { 1 * i, 2 * i, 3 * i };
CreateCustomComboBoxDataSouce(i, text, data);
}
}
private void CreateCustomComboBoxDataSouce(int row, string texst, int[] data)
{
dataGridView1.Rows.Add(texst);
DataGridViewComboBoxCell comboCell = dataGridView1[1, row] as DataGridViewComboBoxCell;
comboCell.DataSource = new BindingSource(data, null);
}
}
Another solution i have solve through using DataSet (multiple dataTables), and becuase DataSet is class variable, holds all the DataTables inside - and if you maybe need some values from a specifc dataTable, you can easily get it.
Example code:
DataSet ds;
public Form1()
{
InitializeComponent();
ds = new DataSet();
dataGridView1.Columns.Add("col1", "Column1");
DataGridViewComboBoxColumn comboCol = new DataGridViewComboBoxColumn();
comboCol.Name = "cmbColumn";
comboCol.HeaderText = "combobox column";
dataGridView1.Columns.Add(comboCol);
for (int i = 0; i < 10; i++)
{
string text = "item " + i;
int[] data = { 1 * i, 2 * i, 3 * i };
DataTable table = new DataTable("table" + i);
table.Columns.Add("column1", typeof(string));
foreach (int item in data)
table.Rows.Add(item);
ds.Tables.Add(table);
CreateCustomComboBoxDataSouce(i, text, table);
}
}
private void CreateCustomComboBoxDataSouce(int row, string texst, DataTable table)
{
dataGridView1.Rows.Add(texst);
DataGridViewComboBoxCell comboCell = dataGridView1[1, row] as DataGridViewComboBoxCell;
comboCell.DataSource = new BindingSource(table, null);
comboCell.DisplayMember = "column1";
comboCell.ValueMember = "column1";
}