Событие форматирования ячейки DataGridView, предотвращающее рисование формы

StackOverflow https://stackoverflow.com/questions/1828733

Вопрос

Я использую 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;
    }
}

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

Menu bar picture

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

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

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

Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top