Как добавить более одного изображения в DataGridViewImageColoumn и добавить событие для каждого изображения в окнах форм

Мне нужно добавить более одного изображения (three images) чтобы Data Grid Viewстолбец изображений, но столбец изображений по умолчанию не позволяет мне устанавливать более одного изображения. И мне нужно прикрепить отдельное событие к каждому изображению.
Поскольку я новичок в программировании, пожалуйста, помогите мне. Спасибо!
Вот мой код для добавления столбца изображения в Data Grid View и инициализировать image coloumn:

DataGridViewImageColumn dgColMemos = new DataGridViewImageColumn();

Инициализация столбцов (я не включаю весь код):

this.dgPartslist[sColName, iRowIndex].Value = (Image)Properties.Resources.Memo_Image; 

1 ответ

Решение

Наиболее гибкое решение для хранения данных в месте, которое не позволяет хранить много предметов, но предлагает Tag стоит создать подходящий класс:

class ImagesTag
{
    public Image Img1 { get; set; }
    public Image Img2 { get; set; }
    public Image Img3 { get; set; }
    public int CurrentImg { get; set; }

    public ImagesTag(Image i1, Image i2, Image i3)
    { CurrentImg = 0; Img1 = i1; Img2 = i2; Img3 = i3; }
}

Теперь вы можете добавить экземпляр к каждому ImageCell's Tag в дополнение к настройке самого изображения; здесь я установил 3 ряда:

DataGridViewImageColumn dgColMemos = new DataGridViewImageColumn();

dataGridView1.Columns.Add(dgColMemos);
dataGridView1.RowCount = 3;

for (Int16 r = 0; r < dataGridView1.RowCount; r++)
{
    ImagesTag I3 = new ImagesTag(imageList2.Images[r * 3], 
                   imageList2.Images[r * 3 + 1], imageList2.Images[r * 3 + 2]);
    dataGridView1[0, r].Value = I3.Img1;
    dataGridView1[0, r].Tag = I3;
}

Обратите внимание, что я не получаю доступ к ресурсам, но ImageList для моих тестов. Ваш установочный код будет сильно отличаться!

Я установил первый Image чтобы отобразить и поместить этот индекс в классе, а также. Это потому, что трудно или даже невозможно без изучения пикселей определить, какое изображение отображается в данный момент.

Вот пример поворота трех изображений на MouseClick:

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
  ImagesTag I3 = (ImagesTag)(dataGridView1[e.ColumnIndex, e.RowIndex].Tag);
  int current = (int)(I3.CurrentImg);
  int next = ++current % 3;
  dataGridView1[0, e.RowIndex].Value = next == 0 ? I3.Img1 : next == 1 ? I3.Img2 : I3.Img3;
  I3.CurrentImg = next;
  dataGridView1[0, e.RowIndex].Tag = I3;
}

Конечно, вы можете адаптировать дизайн класса к вашим потребностям; Вы можете заменить 3 жестко закодированных изображения List<Image>, вы можете добавлять события / делегаты для вызова при нажатии, добавлять тексты для отображения в виде всплывающих подсказок и т. д.

Другие вопросы по тегам