Click here to Skip to main content
65,938 articles
CodeProject is changing. Read more.
Articles / Languages / C#

How to add other controls to DataGrid - (Part I )

4.81/5 (25 votes)
19 Nov 2005CPOL 1   9K  
How to add other controls to DataGrid?

Introduction

I always wanted to know how to use controls such as TextBox, ComboBox, RadioButton, Button etc. in a DataGrid cell. You can also fire their events easily. Nowadays it's very simple to do this! You must create a DataGridTableStyle and add a DataGridTextboxColumns to it. After that, you can add each control you want to the DataGridTextboxColumns.

C#
TextBox txtBox = new TextBox();
datagridTextBoxColumn.TextBox.Controls.Add( txtBox );

Now, let me describe my sample. First, I design a DataTable and fill my DataGrid with it:

C#
private DataSet    ds = new DataSet("myDs");
private DataTable  dt = new DataTable("myDT");
C#
private void FillData()
{
    //Add datatable object to dataset object.
    ds.Tables.Add(dt);

    //Create a new column for datatable.
    DataColumn dc = new DataColumn("Label_Col" , 
                    System.Type.GetType("System.String"));
    //Add created column to datatable object.
    dt.Columns.Add(dc);

    //Create a new column for datatable.
    dc = new DataColumn("TextBox_Col" , 
             System.Type.GetType("System.String"));
    //Add created column to datatable object.
    dt.Columns.Add(dc);    

    //Create a new column for datatable.
    dc = new DataColumn("ComboBox_Col", 
             System.Type.GetType("System.String"));
    //Add created column to datatable object.
    dt.Columns.Add(dc);
    
    //Add new row to datatble.
    DataRow dr;
    for(int i=1; i<=5; i++)
    {
        dr                 = dt.NewRow();
        dr["Label_Col"]    = "lable"+i.ToString();
        dr["TextBox_Col"]  = "textbox"+i.ToString();
        dr["ComboBox_Col"] = "combobox"+i.ToString();
        dt.Rows.Add(dr);
    }
}

After you load data in your DataGrid and design its DataGridTableStyle, you must write this code in the MouseUp event of DataGrid:

C#
hitTestGrid = dataGrid.HitTest(e.X, e.Y);
if(hitTestGrid != null)
{
    //Which column of datagrid has been clicked.
    switch(hitTestGrid.Column)
    {
        case 0:
          //Add label control to datagrid.
          dataGridLable.TextBox.Controls.Add( lblControl );
          lblControl.Text = 
             dataGrid[dataGrid.CurrentRowIndex , 0].ToString();
          break;
        
        case 1:
          //Add texbox control to datagrid.
          dataGridTextBox.TextBox.Controls.Add( txtControl );
          txtControl.Text = 
              dataGrid[dataGrid.CurrentRowIndex , 1].ToString();
          txtControl.Focus();
          break;
        
        case 2:
          //Add combobox control to datagrid.
          dataGridComboBox.TextBox.Controls.Add( cboControl );

          for(int i=0; i<CBOCONTROL.ITEMS.COUNT; pre }< } break; 
           cboControl.SelectedIndex="i;" 2].ToString()) , 
           dataGrid[dataGrid.CurrentRowIndex if(
               cboControl.Items[i].ToString()="=" { i++)>

You can initialize your controls, which will be added to the DataGrid, and fire their events:

C#
private void InitializeControls()
{
    //label property
    lblControl.Cursor    = Cursors.Hand;
    lblControl.ForeColor = Color.Red;
    lblControl.Font      = new Font("Arial", 12, 
                           FontStyle.Bold | FontStyle.Italic);

    //textbox property
    txtControl.Cursor    = Cursors.Hand;
    txtControl.BackColor = Color.WhiteSmoke;
    txtControl.ForeColor = Color.DarkSlateBlue;
    txtControl.Font      = new Font("Arial", 8, FontStyle.Bold);
    
    //textbox events.
    txtControl.TextChanged+=new EventHandler(txtTextChanged);

    //Define and add ComboBox rows, will be added to data grid.
    for(int i=1;    i<=5;    i++)
        cboControl.Items.Add("combobox"+i.ToString());

    //combobox property
    cboControl.Cursor        = Cursors.Hand;
    cboControl.DropDownStyle = ComboBoxStyle.DropDownList;
    //combobox events.
    cboControl.SelectedIndexChanged+=
    new EventHandler(cboSelectedIndexChanged);
}

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)