Datagridview Image Column Setting Image - С#

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

Ответ 1

Например, у вас есть элемент управления DataGridView с именем "dataGridView1" с двумя текстовыми столбцами и одним столбцом изображения. У вас также есть изображения в файле ресурсов с именем 'image00' и 'image01'.

Вы можете добавлять изображения при добавлении таких строк:

  dataGridView1.Rows.Add("test", "test1", Properties.Resources.image00);

Вы также можете изменить изображение во время работы вашего приложения:

   dataGridView1.Rows[0].Cells[2].Value = Properties.Resources.image01;

или вы можете сделать вот так:

void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
   {             
        if (dataGridView1.Columns[e.ColumnIndex].Name == "StatusImage") 
        { 
             // Your code would go here - below is just the code I used to test 
              e.Value = Image.FromFile(@"C:\Pictures\TestImage.jpg"); 
        } 
   } 

Ответ 2

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

dgv2.Rows[e.RowIndex].Cells[8].Value = Properties.Resources.OnTime;

Проблема заключается в том, что каждый раз создается новый объект изображения, который можно увидеть в файле конструктора ресурсов:

internal static System.Drawing.Bitmap bullet_orange {
    get {
        object obj = ResourceManager.GetObject("bullet_orange", resourceCulture);
        return ((System.Drawing.Bitmap)(obj));
    }
}  

Если есть 300 (или 3000) строк с таким же статусом, каждый из них не нуждается в собственном объекте изображения и не нуждается в новом при каждом событии. Во-вторых, ранее созданные изображения не располагаются.

Чтобы избежать всего этого, просто загрузите изображения ресурсов в массив и используйте/назначьте оттуда:

private Image[] StatusImgs;
...
StatusImgs = new Image[] { Resources.yes16w, Resources.no16w };

Затем в событии CellFormatting:

if (dgv2.Rows[e.RowIndex].IsNewRow) return;
if (e.ColumnIndex != 8) return;

if ((bool)dgv2.Rows[e.RowIndex].Cells["Active"].Value)
    dgv2.Rows[e.RowIndex].Cells["Status"].Value = StatusImgs[0];
else
    dgv2.Rows[e.RowIndex].Cells["Status"].Value = StatusImgs[1];

Те же 2 объекта изображения используются для всех строк.