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?

Original source

Related problems