Настройка столбца изображения Datagridview - C # - PullRequest
13 голосов
/ 18 ноября 2011

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

Ответы [ 2 ]

28 голосов
/ 18 ноября 2011

Например, у вас есть элемент управления 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"); 
        } 
   } 
4 голосов
/ 12 января 2017

Несмотря на то, что ответ работает, он довольно существенный. Он предлагает загружать изображения непосредственно из 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 объекта изображения используются для всех строк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...