[Solved] how do I host a control in a DataGridViewCell for displaying as well as editing?

I’ve seen How to: Host Controls in Windows Forms DataGridView Cells which explains how to host a control for editing a cell in a DataGridView. But how can I host a control for displaying a cell?

I need to display a file name and a button in the same cell. Our UI designer is a graphic designer not a programmer, so I have to match the code to what he’s drawn, whether it’s possible – or wise – or not. We’re using VS2008 and writing in C# for .NET 3.5, if that makes a difference.

UPDATE: The ‘net suggests creating a custom DataGridViewCell which hosts a panel as a first step; anyone done that?

Enquirer: Simon


Solution #1:

As per your “UPDATE”, creating a custom DataGridViewCell is the way this is done. I’ve done it, and it doesn’t require that much modification from the example code available from the MSDN. In my case, I needed a bunch of custom editing controls, so I ended up inheriting from DataGridViewTextBoxCell and DataGridViewColumn. I inserted into my class (the one inherited from DataGridViewTextBoxCell) a new custom control which implemented IDataGridViewEditingControl, and it all just worked.

I suppose that in your case, you could write a PanelDataGridViewCell which would contain a control MyPanelControl which would inherit from Panel and implement IDataGridViewEditingControl.

Respondent: Simon

Solution #2:

Rather than use a datagridview, how about using a TableLayoutPanel instead. Create your control that has a label and a button and events and fill your layout panel with them. Your control becomes the cell so to speak. It doesn’t take much to make the table layout panel to look like a datagridview, if that is the layout style you want.

Respondent: Shalom Craimer

Solution #3:

There are two ways to do this:

1). Cast a DataGridViewCell to a certain cell type that exists. For example, convert a DataGridViewTextBoxCell to DataGridViewComboBoxCell type.

2). 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.

See Zhi-Xin Ye’s sample code below which illustrates the tricks:

private void Form_Load(object sender, EventArgs e)
    DataTable dt = new DataTable();
    for (int j = 0; j < 10; j++)
    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
    //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;

MSDN Reference : how to host different controls in the same column in DataGridView control

Using the 1st method looks like this:

Different Controls in DataGridView Column

Using the 2nd method looks like this:

enter image description here

Additional info: Controls in the same DataGridView column dont render while initializing grid

Respondent: Billy Coover

The answers/resolutions are collected from stackoverflow, are licensed under cc by-sa 2.5 , cc by-sa 3.0 and cc by-sa 4.0 .

Leave a Reply

Your email address will not be published.