DataGridViewImageColumn, мерцание изображений

У меня есть DataGridView, связанный с DataTable в моей форме Windows. Я хочу вставить несвязанный DataGridViewImagecolumn к нему и установить изображения в соответствии со значением другого столбца. Изображение устанавливается в событии DataGidView_CellFormating. Код выглядит следующим образом

DataGridView dgvResult = new DataGridView();
dgvResult.DataSource = dtResult;
DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();
imageColumn.Width = 40;
imageColumn.Name = "Image";
imageColumn.HeaderText = "";
dgvResult.Columns.Insert(0, imageColumn);

    private void dgvResult_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
    {
        if (dgvResult.Columns[e.ColumnIndex].Name == "Image")
        {
            DataGridViewRow row = dgvResult.Rows[e.RowIndex];
            if (Utils.isNumeric(row.Cells["CM_IsExport"].Value.ToString()) && Int32.Parse(row.Cells["CM_IsExport"].Value.ToString()) == 1)
            {
                    row.Cells["Image"].Value = Properties.Resources.export16;
            }
            else { row.Cells["Image"].Value = Properties.Resources.plain16; }
        }
    }

Все работает нормально. Моя проблема в том, что изображения, показанные в ячейках, мерцают. Кто-нибудь знает почему?

1 ответ

Мерцание происходит потому, что вы устанавливаете изображение в CellFormatting обработчик события.

Согласно MSDN, CellFormatting Событие происходит каждый раз, когда окрашивается каждая ячейка, поэтому вам следует избегать длительной обработки при обработке этого события.

Вы можете установить изображение, обрабатывая DataBindingComplete или же CellValueChanged события в соответствии с вашими потребностями.

Вы также можете включить DoubleBuffering для DataGridView создавая кастом DataGridView или с помощью отражения для примера, который вы используете.

class CustomDataGridView : DataGridView
{
    public CustomDataGridView()
    {
        DoubleBuffered = true;
    }
}
Другие вопросы по тегам