从OnSelectionChangeCommitted DataGridViewComboBoxEditingControl向列对象提供覆盖值

时间:2016-06-13 11:25:18

标签: c# winforms datagridviewcombobox datagridviewcomboboxcell

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

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

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

我们如何从编辑控件中做到这一点?

进一步解释:

列表组合项由“列”对象添加。因此我们有一套15种颜色可供选择。现在我已经在列表顶部添加了一种genric颜色。

因此,用户调用编辑,删除列表显示,然后选择项目0.我们使用前面提到的处理程序拦截它。由于他们选择了第0项,我们会显示一个弹出对话框,让他们选择不同的颜色。

当他们选择时,我们现在必须找到它或将其添加到列的强制项列表中。现在有意义吗?

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

我不使用DataSource。我在列构造函数中填充如下:

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

1 个答案:

答案 0 :(得分:1)

您可以使用EditingControlDataGridView查找拥有编辑控件的DataGridView。然后,您可以使用网格的CurrentCell属性来查找当前单元格,使用ColumnIndex您将找到列索引。然后使用Columns集合,您可以获得该索引处的列:

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