Нежелательное сворачивание ComboBox в ячейке

143
26 января 2020, 11:00

Вот такая проблема: если я выбираю ячейку, у которой номер столбца и строки совпадает, то после раскрытия ComboBox "теряется фокус" (фокус не теряется, конечно, но компонент сворачивается и отменяется событие EditingControlShowing) при любом действии мышью и, как следствие, не могу оперировать с его элементами. В аналогичных ячейках с другими индексами позиции такого не происходит и при раскрытии ComboBox я могу дальше выбирать элементы.

Вот при редактировании ячейки 1-ой строки все нормально, а при редактировании 5-ой у ячейки с индексом [5,5] проблемы:

Прилагаю код, отвечающий за данные действия:

    /// <summary>
    /// Событие клика по ячейке
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void DGV_TrafficLights_CellClick(object sender, DataGridViewCellEventArgs e)
    {
        if (DGV_TrafficLights.CurrentCell.OwningColumn.Name == "StartSignalColor")
        {
            // Делаем из TextBox-ячейки ComboBox-ячейку
            DataGridViewComboBoxCell dgv_cb_SSCs = new DataGridViewComboBoxCell();
            dgv_cb_SSCs.Items.Add(Color.Green);
            dgv_cb_SSCs.Items.Add(Color.Red);
            DGV_TrafficLights[e.ColumnIndex, e.RowIndex] = dgv_cb_SSCs;
        }
    }
    /// <summary>
    /// Событие при отведении указателя мыши от ячейки
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void DGV_TrafficLights_CellMouseLeave(object sender, DataGridViewCellEventArgs e)
    {
        if (DGV_TrafficLights.CurrentCell.OwningColumn.Name == "StartSignalColor")
        {
            if (DGV_TrafficLights.CurrentCell is DataGridViewComboBoxCell)
            {
                DGV_TrafficLights[e.ColumnIndex, e.RowIndex] = new DataGridViewTextBoxCell
                {
                    Value = DGV_TrafficLights.CurrentCell.Value
                };
            }
        }
    }
    /// <summary>
    /// Событие обработки ошибки данных
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void DGV_TrafficLights_DataError(object sender, DataGridViewDataErrorEventArgs e)
    {
        //MessageBox.Show("Ошибка данных (DataError)", "Ошибка");
    }
    /// <summary>
    /// Событие отображение элемента управления для редактирования ячейки
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void DGV_TrafficLights_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
    {
        if (e.Control is ComboBox cb_SSCs)
        {
            cb_SSCs.DrawMode = DrawMode.OwnerDrawFixed;
            cb_SSCs.DrawItem -= CB_DrawItem;
            cb_SSCs.DrawItem += new DrawItemEventHandler(CB_DrawItem);
            cb_SSCs.SelectionChangeCommitted -= CB_SelectionChangeCommitted;
            cb_SSCs.SelectionChangeCommitted += new EventHandler(CB_SelectionChangeCommitted);
        }
    }
    /// <summary>
    /// Событие прорисовки элемента комбобокса
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void CB_DrawItem(object sender, DrawItemEventArgs e)
    {
        if (sender is ComboBox cb)
        {
            using (SolidBrush signalColor = new SolidBrush((Color)cb.Items[e.Index]))
            {
                string signalName = signalColor.Color.Name;
                e.Graphics.FillRectangle(signalColor, e.Bounds);
                e.Graphics.DrawString(signalName, e.Font, Brushes.Black, e.Bounds);
            }
        }
    }
    /// <summary>
    /// Событие после изменения значения у выбранного комбобокса
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void CB_SelectionChangeCommitted(object sender, EventArgs e)
    {
        if (sender is ComboBox cb)
        {
            if (DGV_TrafficLights.CurrentCell is DataGridViewComboBoxCell)
            {
                DGV_TrafficLights[DGV_TrafficLights.CurrentCell.ColumnIndex, DGV_TrafficLights.CurrentCell.RowIndex] = new DataGridViewTextBoxCell
                {
                    Value = cb.Text
                };
            }
        }
    }
READ ALSO
Десериализация JSON с массивами в C#

Десериализация JSON с массивами в C#

JSON файл содержит поле и три массиваПервые 2 массива описывают данные, последний массив содержит массивы с данными, каждый массив это один...

151
Как создать аналог event listener на php?

Как создать аналог event listener на php?

Нужен метод который будет отслеживать изменения в свойствах другого классаПодскажите, пожалуйста, как можно это реализовать или где об этом...

139
Регулярные выражения php preg_match

Регулярные выражения php preg_match

Пытаюсь достать из переменной $result_text ГОСТы, когда в переменной храню короткую строку в которую включён какой нибудь ГОСТ, preg_match_all находитИ...

190
Вывести 3 рандомных числа из массива

Вывести 3 рандомных числа из массива

У меня есть две таблицыВ одной таблице id пользователей, в другой id пользователей, которых функция рандома не должна вызвать

163