2015-02-24 3 views
0

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

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; } 
     } 
    } 

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

+0

Мерцание? Можете ли вы разместить видео/gif? Вы имеете в виду эффект iPhone (тот, когда вы держите случайную пиктограмму) – Ave

+0

Не похоже на значок iPhone, мерцающий. Но чувствует, что это освежает его каждую секунду. Я не знаю, как публиковать видео. –

+0

О, я понимаю. Не уверен в этой проблеме. – Ave

ответ

1

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

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

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

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

class CustomDataGridView : DataGridView 
{ 
    public CustomDataGridView() 
    { 
     DoubleBuffered = true; 
    } 
} 
+0

Благодарим за помощь. Я переместил код в событие RowsAdded. Сейчас все в порядке. –

+0

Проблему мерцания можно решить, перемещая код в событие RowsAdded. Но когда число записей больше (скажем 200 записей), загрузка сетки занимает от 2 до 3 секунд. с событием CellFormating, он быстро загружался. –

+0

@ user1542352 Записываете ли вы данные DataGridView.Rows' в изображение RowsAdded? – Junaith

Смежные вопросы