Как определить стиль, применяемый к DataGridView через e.CellStyle.BackColor в событии CellFormatting?

57
4

Если мы применили стиль (e.CellStyle.BackColor say) к некоторым строкам через событие CellFormatting в DataGridView, можно ли затем определить этот стиль на более позднем этапе?


Например, в настоящее время мы используем общий блок кода для обработки печати и экспорта в Excel для любых наших DataGridView. До сих пор код не удовлетворял ни одному стилю.


Итак, мы хотим добавить его.


Если мы проверим .DefaultCellStyle строки или ячейки, тогда наш стиль не будет отображаться (он просто отображается как 0 или черный, что совершенно неверно).


Я предполагаю, что, поскольку мы применили стиль с помощью события CellFormatting, вместо того, чтобы вставлять его в DefaultCellStyle.

спросил(а) 2012-05-15T18:58:00+04:00 8 лет, 5 месяцев назад
1
Решение
58

К сожалению, я не смог найти полное решение вашей проблемы, только работа.


Некоторые эксперименты с событием CellFormatting с использованием примера из MSDN привели к тому, что я увидел именно то, что вы видели - BackColor был явно установленный, но CellStyle не отражал этого. 1


Обнаруженная работа заключалась в том, чтобы не использовать свойство DataGridViewCellFormattingEventArgs CellStyle, а вместо этого перейти прямо к сетке. Это имеет недостаток, что теперь вам нужно вручную обрабатывать случай, когда вы не хотите форматировать ячейку.


У меня есть код ниже, показывающий это - он снова просто модифицирует код MSDN:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
// If the column is the Artist column, check the
// value.
if (this.dataGridView1.Columns[e.ColumnIndex].Name == "Artist")
{
if (e.Value != null)
{
// Check for the string "pink" in the cell.
string stringValue = (string)e.Value;
stringValue = stringValue.ToLower();
if ((stringValue.IndexOf("pink") > -1))
{
// With the commented line below we cannot access the new style
//e.CellStyle.BackColor = Color.Pink;

// With this line we can!
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = Color.Pink;
}
else
{
// With the original MSDN code the else block to reset the
// cell style was not needed.
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style.BackColor = dataGridView1.DefaultCellStyle.BackColor;
}

}
}
}


1. Моя теория такова, что это похоже на путаницу людей по методу .Refresh(), где DataGridView имеет два очень разных вида самого себя: один из которых является прямоугольником, нарисованным на экран, а другой - базовые данные. С помощью метода .Refresh() вы только перерисовываете прямоугольник, вы не обновляете данные. Я думаю, что это так: событие CellFormatting только форматирует во время рисования и ничего не делает для самих стилей сетки.

ответил(а) 2012-05-16T13:21:00+04:00 8 лет, 5 месяцев назад
-4

Возможным решением будет добавить второй обработчик в общий блок печати кода (непосредственно перед фактической печатью). Этот обработчик должен быть прикреплен к событию CellFormatting и сохранять только e.cellstyle во временном хранилище (например, словарь сотовых стилей).


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

См. также Есть ли способ заставить DataGridView запустить его событие CellFormatting для всех ячеек?

ответил(а) 2015-06-24T15:48:00+03:00 5 лет, 3 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема