Пользовательская отрисовка DatagridViewComboBoxColumn - PullRequest
2 голосов
/ 20 сентября 2011

Я использую DataGridView с DataGridViewComboBoxColumn, и мне нужно добавить значки слева от элементов комбинированного списка. В настоящее время я использую событие EditingControlShowing вместе с событием ComboBox.DrawItem, например:

private void pFiles_dgvFiles_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e)
{
    if (e.Control is ComboBox)
    {
    ComboBox cb = (ComboBox)e.Control;                                
    cb.DrawMode = DrawMode.OwnerDrawFixed;
    cb.DrawItem -= combobox1_DrawItem;
    cb.DrawItem += combobox1_DrawItem;
     }
}

private void combobox1_DrawItem(object sender, DrawItemEventArgs e)
{
    // Drawing icon here        
}

Проблема в том, что значки отображаются только в том случае, если ячейка находится в режиме редактирования. Как только я щелкаю где-то за пределами ячейки, происходит событие CellEndEdit, и ячейка перерисовывается (без значка).

Я попытался использовать событие DataGridView.CellPainting для решения этой проблемы, но это приводит к исчезновению выпадающей кнопки DataGridViewComboBoxColumn.

Есть идеи, как нарисовать значок после того, как пользователь закончил редактирование ячейки?

1 Ответ

2 голосов
/ 20 сентября 2011

В вашем событии CellPainting вы можете попробовать закрасить существующие элементы управления:

e.PaintBackground(e.ClipBounds, true);
e.PaintContents(e.ClipBounds);

//Draw your stuff

e.Handled = true;

или найдите класс ComboBoxRenderer для метода DrawDropDownButton (или ControlPaint.DrawComboButton для невизуальных стилей).

...