Событие DataGridView CellFormatting, предотвращающее рисование форм - PullRequest
3 голосов
/ 01 декабря 2009

Я использую C #, Winforms и .Net 3.5

Моя форма имеет пользовательский DataGridView (двойной буфер для предотвращения мерцания во время моих событий форматирования ячейки, , как показано здесь ). Когда я выполняю поиск в базе данных, я связываю полученный набор данных с datagridview.

Я обрабатываю событие CellFormatting, чтобы нарисовать строки определенного цвета, в зависимости от их данных.

Мой код DataGridView:

resultsGridView.DataSource = results.DefaultViewManager.DataSet.Tables[0];
resultsGridView.AlternatingRowsDefaultCellStyle.BackColor = Color.AliceBlue;
resultsGridView.BorderStyle = BorderStyle.Fixed3D;
resultsGridView.CellFormatting += new DataGridViewCellFormattingEventHandler(resultsGridView_CellFormatting);

Код моего мобильного формата:

void resultsGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    int rowIndex = e.RowIndex;
    DataGridViewRow therow = resultsGridView.Rows[rowIndex];
    if ((bool)therow.Cells["Sealed"].Value == true)
    {
        therow.DefaultCellStyle.BackColor = Color.Pink;
    }
    if (therow.Cells["Database"].Value as string == "PNG")
    {
        therow.DefaultCellStyle.BackColor = Color.LightGreen;
    }
}

Все отлично работает, за исключением того, что, когда я обрабатываю CellFormatting, событие Paint всей формы кажется отключенным. Курсор перестанет мигать в текстовом поле, и меню будет выглядеть так:

Menu bar picture

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

Комментирование строки resultsGridView.CellFormatting в коде datagridview полностью решает проблему.

Я неправильно рисую клетки или мне нужно еще кое-что обработать?

1 Ответ

1 голос
/ 02 декабря 2009

Возможно, вы вызываете исключение внутри этого события.Я не уверен, как определяется обработка, но первым шагом будет окружение кода попыткой catch.

try 
{
   int rowIndex = e.RowIndex;
   ....   
}
catch(Exception ex)
{
    System.Diagnostics.Trace.Error(ex.message);
}

Во втором случае я не думаю, что therow.Cells["Sealed"] будет работать.Попробуйте что-то вроде therow.Cells["dataGridViewTextBoxColumn2"].Ячейки индексируются как Имя столбца , а не DataPropertyName .

...