Search code examples
c#winformsdatagridviewcomboboxdatagridviewcomboboxcell

Feeding a override value from OnSelectionChangeCommitted DataGridViewComboBoxEditingControl to column object


So I have this and I know it is wrong:

protected override void OnSelectionChangeCommitted(EventArgs e)
{
    if (SelectedIndex == 0)
    {
        GENIO_Viewer.FullColourPaletteForm dlgColour = new GENIO_Viewer.FullColourPaletteForm();
        if(dlgColour.ShowDialog() == DialogResult.OK)
        {
            bool bFound = false;
            for(int i = 1; i < Items.Count; i++)
            {
                ComboboxColourItem ocbItem = (ComboboxColourItem)Items[i];
                if(ocbItem.Index == dlgColour.iSelectedColour)
                {
                    SelectedIndex = i;
                    bFound = true;
                    break;
                    // We can just select this one
                }
            }
            if(!bFound)
            {
                // Add it
                ComboboxColourItem ocbItem = ComboboxColourItem.Create((ushort)dlgColour.iSelectedColour);
                Items.Add(ocbItem);
                SelectedIndex = Items.Count - 1;
            }
        }
    }

    base.OnSelectionChangeCommitted(e);
}

This handler is part of my DataGridViewComboBoxEditingControl. But it is the wrong place to add new Items.

I can't workout how to get access to the owning Column as that is where I need to add the Item, otherwise I get exceptions.

I have looked here: https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxeditingcontrol(v=vs.110).aspx

But i can't see a property I can use to get the column object.

How do we do this from the editing control?

Further explaination:

The list combo items are added by the "column" object. Thus we have a set of 15 colours to choose from. Now I have added a genric colour tot he top of the list.

So, the user invokes the edit, droplist displays, and they pick item 0. We intercept this with the aforementioned handler. Since they picked item 0, we show a popup dialogue to let them choose a different colour.

When they have chosen, we must now either find it or add it to the the mandatory list of items for the column. Make sense now?

I tried to use the DataGridView Notify object but for some reason it is not showing in the list of available functions.

I don't use a DataSource. I populate like this in the columns constructor:

private void InitialiseComboItems()
{
    List<ushort> listColours = new List<ushort>();
    listColours.Add(0);
    listColours.Add(1);
    listColours.Add(2);
    listColours.Add(3);
    listColours.Add(4);
    listColours.Add(5);
    listColours.Add(6);
    listColours.Add(7);
    listColours.Add(8);
    listColours.Add(9);
    listColours.Add(250);
    listColours.Add(251);
    listColours.Add(252);
    listColours.Add(253);
    listColours.Add(254);
    listColours.Add(255);

    this.Items.Clear();
    foreach (ushort iColourIndex in listColours)
        this.Items.Add(ComboboxColourItem.Create(iColourIndex));
}

I also have a helper method:

public ComboboxColourItem InsertColour(ushort iColourIndex)
{
    ComboboxColourItem ocbItem = ComboboxColourItem.Create(iColourIndex);

    bool bAppend = true;
    if (Items.Count > 16)
    {
        // There are other colours, need to find right index
        for(int i = 16; i < Items.Count; i++)
        {
            if(ocbItem.Index < ((ComboboxColourItem)Items[i]).Index)
            {
                bAppend = false;
                Items.Insert(i, ocbItem);
                break;
            }
        }
    }
    if (bAppend)
        Items.Add(ocbItem);

    return ocbItem;
}

Solution

  • You can use EditingControlDataGridView to find the DataGridView which owns the editing control. Then you can use CurrentCell property of grid to find the current cell and using ColumnIndex you will find the column index. Then using Columns collection, you can get the column at that index:

    var c = this.EditingControlDataGridView
                .Columns[this.EditingControlDataGridView.CurrentCell.ColumnIndex]
                as DataGridViewComboBoxColumn;
    if (c != null)
        c.Items.Add("Something");