Hi,
The DataGridView has an AutoGenerateColumns property, which is by default set to True, and in that case it will automatically generate the DataGridView columns for you when you assign some datasource to DataGridView.DataSource.
This automatic generation of columns will not automatically generate DataGridViewComboBoxColumn columns for you, so you will have to do that manually (by code), or via the designer (which is also by code).
Say to have a DataTable with two columns: Name, PostalCode and then you have another DataTable for Postal codes. You want to display the first table in your DataGridView, with PostalCode as ComboBox column.
You can approach this in two ways. You can leave the DataGridView.AutoGenerateColumns as True, assign the datasource and then remove the PostalCode column and add it back as a DataGridViewComboBoxColumn. Or, you can have DataGridView.AutoGenerateColumns as False, and build both your columns manually.
This is basically all shown in the CompanionKit's samples, but a simple code might look something like this:
private void Form3_Load(object sender, EventArgs e)
{
DataTable main1 = new DataTable();
main1.Columns.Add("Name");
main1.Columns.Add("PostalCode");
DataTable postal1 = new DataTable();
postal1.Columns.Add("pPostalCode");
postal1.Rows.Add("P1");
postal1.Rows.Add("P2");
PopulateAuto(this.dataGridView1, main1, postal1);
DataTable main2 = new DataTable();
main2.Columns.Add("Name");
main2.Columns.Add("PostalCode");
DataTable postal2 = new DataTable();
postal2.Columns.Add("pPostalCode");
postal2.Rows.Add("P1");
postal2.Rows.Add("P2");
PopulateManually(this.dataGridView2, main2, postal2);
}
private void PopulateAuto(DataGridView dgv, DataTable dtMain, DataTable dtPostal)
{
dgv.Columns.Clear();
dgv.AutoGenerateColumns = true;
dgv.DataSource = dtMain;
dgv.Columns.Remove("PostalCode");
DataGridViewComboBoxColumn cc = new DataGridViewComboBoxColumn();
cc.DisplayMember = "pPostalCode";
cc.ValueMember = "pPostalCode";
cc.DataSource = dtPostal;
cc.DataPropertyName = "PostalCode";
dgv.Columns.Add(cc);
}
private void PopulateManually(DataGridView dgv, DataTable dtMain, DataTable dtPostal)
{
dgv.Columns.Clear();
dgv.AutoGenerateColumns = false;
dgv.DataSource = dtMain;
DataGridViewTextBoxColumn tc = new DataGridViewTextBoxColumn();
tc.DataPropertyName = "Name";
DataGridViewComboBoxColumn cc = new DataGridViewComboBoxColumn();
cc.DisplayMember = "pPostalCode";
cc.ValueMember = "pPostalCode";
cc.DataSource = dtPostal;
cc.DataPropertyName = "PostalCode";
dgv.Columns.Add(tc);
dgv.Columns.Add(cc);
}
Hope this helps,
Palli