Search code examples
c#datagridviewdatagridviewcombobox

How to get a ComboBox in a DataGridViewCell to drop down after a single click?


I have a DataGridView which has it's first column's style set to a ComboBox rather than the default TextBox. Since the number of rows in the DataGridView is not fixed on startup I cannot load in data to the ComboBoxes for each row when a new row is added. So I tried loading on the event of a user adding a row to the DataGridView:

public void myDataGridView_UserAddedRow(object sender, DataGridViewRowEventArgs e)
{
    // Identifiers used are:
    var myTableAdapter = new databaseTableAdapters.myTableTableAdapter();
    var myDataTable = myTableAdapter.GetData();
    int rowIndex = myDataGridView.CurrentcellAddress.Y;
    var comboBoxCell = (DataGridViewComboBoxCell)myDataGridView.Rows[rowIndex].Cells[0];
    string itemToAdd;

    // Load in the data from the data table
    foreach (System.Data.DataRow row in myDataTable.Rows) 
    {
        // Get the current item to be added
        itemToAdd = row[0].ToString();
        // Make sure there are no duplicates
        if (!comboBoxCell.Items.Contains(itemToAdd)) 
        {
            comboBoxCell.Items.Add(itemToAdd)
        }
    }
}

but this only will allow the user to see the drop down options after a second click. I would like to be able to have the user only click on the combo box once and see the options rather than the less intuitive double click. How can this be done?


Solution

  • The cell must gain focus for the drop down to occur, so the double click is actually a single click to gain focus on that cell and the second click is what causes the drop down to occur. So to see how to change focus following this link. I was able to modify the code with a single line of code

    public void myDataGridView_UserAddedRow(object sender, DataGridViewRowEventArgs e)
    {
        // Identifiers used are:
        var myTableAdapter = new databaseTableAdapters.myTableTableAdapter();
        var myDataTable = myTableAdapter.GetData();
        int rowIndex = myDataGridView.CurrentcellAddress.Y;
        var comboBoxCell = (DataGridViewComboBoxCell)myDataGridView.Rows[rowIndex].Cells[0];
        string itemToAdd;
    
        // Load in the data from the data table
        foreach (System.Data.DataRow row in myDataTable.Rows) 
        {
            // Get the current item to be added
            itemToAdd = row[0].ToString();
            // Make sure there are no duplicates
            if (!comboBoxCell.Items.Contains(itemToAdd)) 
            {
                comboBoxCell.Items.Add(itemToAdd)
            }
        }
        // Send the focus to the next combo box (removes need for a double click)
        myDataGridView.CurrentCell = myDataGridView.Rows[rowIndex + 1].Cells[0]; // <--- HERE
    }