将覆盖值从 OnSelectionChangeCommitted DataGridViewComboBoxEditingControl 提供给列对象

Feeding a override value from OnSelectionChangeCommitted DataGridViewComboBoxEditingControl to column object

所以我有这个,我知道这是错误的:

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);
}

此处理程序是我的 DataGridViewComboBoxEditingControl 的一部分。但是添加新的Items.

是错误的地方

我不知道如何访问拥有的 Column,因为这是我需要添加项目的地方,否则我会遇到异常。

我看过这里:https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridviewcomboboxeditingcontrol(v=vs.110).aspx

但是我看不到 属性 我可以用来获取列对象。

我们如何从编辑控件中执行此操作?

进一步说明:

列表组合项由 "column" 对象添加。因此我们有一组 15 种颜色可供选择。现在我在列表的顶部添加了一个通用颜色。

所以,用户调用编辑,显示下拉列表,然后他们选择项目 0。我们使用上述处理程序拦截它。由于他们选择了项目 0,我们显示一个弹出对话框让他们选择不同的颜色。

当他们选择后,我们现在必须找到它或将其添加到列的必填项目列表中。现在明白了吗?

我尝试使用 DataGridView Notify 对象,但由于某种原因它没有显示在可用函数列表中。

我不使用数据源。我在列构造函数中这样填充:

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));
}

我还有一个辅助方法:

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;
}

您可以使用 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 集合,您可以获得该索引处的列:

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