Adding Different DataGridView Cell Types to a Column
c#, cells, datagridview, vb.net
Solution
Have you looked at these:
Mixing cell types in a DataGridViewColumn
DataGridview cells of one column can't have different type
http://social.msdn.microsoft.com/Forums/windows/en-US/148b232b-ce8c-4c49-b35d-50d8a5c448d1/different-cell-types-in-a-datagridview-column
Following from the MSDN article...
There are two ways to do this:
- Cast a `DataGridViewCell` to a certain cell type that exists. For example, convert a `DataGridViewTextBoxCell` to `DataGridViewComboBoxCell` type.
- Create a control and add it into the controls collection of `DataGridView`, set its location and size to fit the cell that to be host.
Here's some sample code which illustrates these tricks:
private void Form5_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("name");
for (int j = 0; j < 10; j++)
{
dt.Rows.Add("");
}
this.dataGridView1.DataSource = dt;
this.dataGridView1.Columns[0].Width = 200;
/*
* First method : Convert to an existed cell type such ComboBox cell,etc
*/
DataGridViewComboBoxCell ComboBoxCell = new DataGridViewComboBoxCell();
ComboBoxCell.Items.AddRange(new string[] { "aaa","bbb","ccc" });
this.dataGridView1[0, 0] = ComboBoxCell;
this.dataGridView1[0, 0].Value = "bbb";
DataGridViewTextBoxCell TextBoxCell = new DataGridViewTextBoxCell();
this.dataGridView1[0, 1] = TextBoxCell;
this.dataGridView1[0, 1].Value = "some text";
DataGridViewCheckBoxCell CheckBoxCell = new DataGridViewCheckBoxCell();
CheckBoxCell.Style.Alignment = DataGridViewContentAlignment.MiddleCenter;
this.dataGridView1[0, 2] = CheckBoxCell;
this.dataGridView1[0, 2].Value = true;
/*
* Second method : Add control to the host in the cell
*/
DateTimePicker dtp = new DateTimePicker();
dtp.Value = DateTime.Now.AddDays(-10);
//add DateTimePicker into the control collection of the DataGridView
this.dataGridView1.Controls.Add(dtp);
//set its location and size to fit the cell
dtp.Location = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Location;
dtp.Size = this.dataGridView1.GetCellDisplayRectangle(0, 3,true).Size;
}
Problem
Goal My datagridview has two columns ([Question], [Answer]). Depending on the known question type (Yes/No Checkbox, Text Textbox, FileUpload Button) I want the column cell to have the respective control. Example Datagridview Rows: - [Question] Do you smoke? [Answer] (YesNo Checkbox) - [Question] How old are you? [Answer] (Text Textbox) - [Question] Document upload [Answer] (FileUpload Button) Work I programmatically create my datagridviews. ``` Private Sub FormatQuestionDgv(ByVal dgv As DataGridView) Dim ColQ As New DataGridViewTextBoxColumn Dim ColA As New DataGridViewColumn 'Header text ColQ.HeaderText = "Question" ColA.HeaderText = "Answer" 'Name ColQ.Name = "ColQ" ColA.Name = "ColA" 'Widths ColQ.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill ColA.AutoSizeMode = DataGridViewAutoSizeColumnMode.Fill 'Add columns With dgv.Columns .Add(ColQ) .Add(ColA) End With End Sub ``` Problem As you can see in my work, the answer column is of `DataGridViewColumn` type. I do not know the question type at that moment. Therefore I declare it as a normal column instead of `DataGridViewCheckBoxColumn`, `DataGridViewTextBoxColumn`, `DataGridViewButtonColumn`... Since those are not the same type as `DataGridViewColumn`, I get the following error: How do I go about adding different control types in 1 DataGridViewColumn? Is it even possible?