У меня есть DataGridView
со столбцом изображения. В свойствах я пытаюсь установить изображение. Я нажимаю на изображение, выбираю файл ресурса проекта и выбираю одно из изображений. Однако изображение по-прежнему отображается как красный x в DataGridView? Кто-нибудь знает, почему?
Datagridview Image Column Setting Image - С#
Ответ 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 объекта изображения используются для всех строк.