Передача значения переопределения из OnSelectionChangeCommitted DataGridViewComboBoxEditingControl в объект столбца

Итак, у меня есть это, и я знаю, что это неправильно:

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 цветов на выбор. Теперь я добавил общий цвет для верхней части списка.

Таким образом, пользователь вызывает редактирование, отображает выпадающий список и выбирает элемент 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;
}

1 ответ

Решение

Ты можешь использовать EditingControlDataGridView найти DataGridView которому принадлежит контроль редактирования. Тогда вы можете использовать CurrentCell свойство сетки, чтобы найти текущую ячейку и используя ColumnIndex Вы найдете индекс столбца. Затем с помощью Columns Коллекция, вы можете получить столбец по этому индексу:

var c = this.EditingControlDataGridView
            .Columns[this.EditingControlDataGridView.CurrentCell.ColumnIndex]
            as DataGridViewComboBoxColumn;
if (c != null)
    c.Items.Add("Something");
Другие вопросы по тегам