Not getting the typed text in editable combobox

Viewed 107

In my datagridview, i have a textboxcolumn and an editable combobox column in winforms.But while typing the new value in combobox text and pressing the enter key, i am not getting the typed value as the corresponding cell value.Could anyone please help with this.

private void dgv_customAttributes_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{

    DataGridViewRow row = dgv_customAttributes.CurrentRow;           
    if (row.Cells[1].Value.ToString() != null)
    {
        //Here the selectedVal is giving the old value instead of the new typed text
        string SelectedVal = row.Cells[1].Value.ToString();
        foreach (CustomAttribute attribute in customAttributes)
        {
            if (row.Cells[0].Value.ToString() == attribute.AttributeName)
            {
                attribute.AttributeValue = SelectedVal;
                break;
            }
        }
    }
}
1 Answers

You need to find out the combo boxes as they are being shown, and attached an event handler to them for when the selected index changes (since it is not possible to obtain that information from the column or the cell themselves).

This means that, unfortunately, capturing the event CellEndEdit is useless.

In the following example, a text box is filled with the chosen option, but you can do anything else, such as selecting a specific value in your enumerated variable or whatever.

    void OnEditingControlShowing(DataGridViewEditingControlShowingEventArgs e)
    {
        if ( e.Control is ComboBox comboEdited ) {
            // Can also be set in the column, globally for all combo boxes
            comboEdited.DataSource = ListBoxItems;
            comboEdited.AutoCompleteMode = AutoCompleteMode.Append;
            comboEdited.AutoCompleteSource = AutoCompleteSource.ListItems;

            // Attach event handler
            comboEdited.SelectedValueChanged +=
                (sender, evt) => this.OnComboSelectedValueChanged( sender );
        }

        return;
    }

    void OnComboSelectedValueChanged(object sender)
    {
        string selectedValue;
        ComboBox comboBox = (ComboBox) sender;
        int selectedIndex = comboBox.SelectedIndex;

        if ( selectedIndex >= 0 ) {
            selectedValue = ListBoxItems[ selectedIndex ];
        } else {
            selectedValue = comboBox.Text;
        }

        this.Form.EdSelected.Text = selectedValue;
    }

Find the complete source code for the table in which a column is a combobox in GitHub.

Hope this helps.

Related