Вам нужно обработать CellPainting
событие DataGridView
и нарисовать ячейку самостоятельно.
Пример
В этом примере показано, как можно нарисовать изображение в ограниченном столбце DataGridView
, чтобы в столбце отображались связанные данные, а также изображение.Например, здесь я решил нарисовать красный значок для отрицательных чисел, серебряный значок для нулевых чисел и зеленый значок для положительных чисел:
Для этого определите некоторые переменные, чтобы сохранить ссылку на изображения.Мы будем использовать эти переменные для рендеринга изображений, а также для удаления изображения, когда оно нам больше не нужно:
Image zero, negative, positive;
Обработка Load
события формы и изображений из файла, ресурса или где бы вы ни хранили изображенияи назначить эти переменные.Настройте привязку данных.Установите подходящий левый отступ для ячейки, в которой вы собираетесь рисовать значок:
private void Form1_Load(object sender, EventArgs e)
{
var list = new[] {
new { C1 = "A", C2 = -2 },
new { C1 = "B", C2 = -1 },
new { C1 = "C", C2 = 0 },
new { C1 = "D", C2 = 1 },
new { C1 = "E", C2 = 2 },
}.ToList();
dataGridView1.DataSource = list;
zero = new Bitmap(16, 16);
using (var g = Graphics.FromImage(zero))
g.Clear(Color.Silver);
negative = new Bitmap(16, 16);
using (var g = Graphics.FromImage(negative))
g.Clear(Color.Red);
positive = new Bitmap(16, 16);
using (var g = Graphics.FromImage(positive))
g.Clear(Color.Green);
//Set padding to have enough room to draw image
dataGridView1.Columns[1].DefaultCellStyle.Padding = new Padding(18, 0, 0, 0);
}
Обрабатывайте CellPainting
событие DataGridView
и визуализируйте содержимое ячейки и изображение для столбцов, которыеВы хотите:
private void DataGridView1_CellPainting(object sender, DataGridViewCellPaintingEventArgs e)
{
//We don't need custom paint for row header or column header
if (e.RowIndex < 0 || e.ColumnIndex != 1) return;
//We don't need custom paint for null value
if (e.Value == null || e.Value == DBNull.Value) return;
//Choose image based on value
Image img = zero;
if ((int)e.Value < 0) img = negative;
else if ((int)e.Value > 0) img = positive;
//Paint cell
e.Paint(e.ClipBounds, DataGridViewPaintParts.All);
e.Graphics.DrawImage(img, e.CellBounds.Left + 1, e.CellBounds.Top + 1,
16, e.CellBounds.Height - 3);
//Prevent default paint
e.Handled = true;
}
Обрабатывать FormClosing
событие для удаления изображений:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//Dispose images
if (zero != null) zero.Dispose();
if (negative != null) negative.Dispose();
if (positive != null) positive.Dispose();
}