Передача значения переопределения из 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");