Как добавить listViewItem со своим уникальным изображением

CView ListView имеет следующие методы добавления, доступные для добавления записи

public virtual ListViewItem Add(ListViewItem value)
public virtual ListViewItem Add(string text)
public virtual ListViewItem Add(string text, int imageIndex)
public virtual ListViewItem Add(string text, string imageKey)
public virtual ListViewItem Add(string key, string text, int imageIndex)
public virtual ListViewItem Add(string key, string text, string imageKey)

Сценарий: у меня есть ListView и я хочу динамически добавлять ListViewItems с их собственными уникальными изображениями в первом столбце. Кроме того, эти изображения могут быть обновлены в зависимости от изменений состояния

Вопрос: Как бы вы это сделали?

Код, с которым я работаю

        private void AddToMyList(SomeDataType message)
        {
            string Entrykey = message.ID;

            //add its 1 column parameters
            string[] rowEntry = new string[1];
            rowEntry[0] = message.name;

            //make it a listviewItem and indicate its row
            ListViewItem row = new ListViewItem(rowEntry, (deviceListView.Items.Count - 1));

            //Tag the row entry as the unique id
            row.Tag = Entrykey;

            //Add the Image to the first column
            row.ImageIndex = 0;

            //Add the image if one is supplied
            imagelistforTypeIcons.Images.Add(Entrykey, message.marker.markerIcon);

            //finally add it to the device list view
            typeListView.Items.Add(row);

        }

1 ответ

Решение

Есть две вещи, которые вам нужно сделать

  • Добавить изображение в ImageList, если его еще нет
  • Создайте новый ListViewItem и назначьте ему изображение из предыдущей точки.

Это может пойти так, в зависимости от вашего кода:

// Add markerIcon to ImageList under Entrykey
imagelistforTypeIcons.Images.Add(Entrykey, message.marker.markerIcon);
// Use icon from ImageList which is stored under Entrykey
ListViewItem row = new ListViewItem(rowEntry);
row.ImageKey = Entrykey;
// Do whatever else you need afterwards
row.Tag = Entrykey;
....

Проблема с кодом в вашем вопросе (без его попытки) выглядит ImageIndex Вы назначаете.

  • Вы добавляете новое изображение в один список изображений, но назначаете изображение ListViewRow от другого
  • Вы предоставляете индекс изображения в конструкторе, но потом устанавливаете его в 0 (почему?)
  • Вы предоставляете неправильный индекс изображения в первую очередь, потому что вы рассчитали индекс последнего изображения в списке изображений перед добавлением нового изображения.

Таким образом, ваш код также может быть в порядке, как это:

// Add markerIcon to ImageList under Entrykey
imagelistforTypeIcons.Images.Add(Entrykey, message.marker.markerIcon);
// Use icon from ImageList which is stored under Entrykey
ListViewItem row = new ListViewItem(rowEntry);
row.ImageIndex = imagelistforTypeIcons.Items.Count - 1;
// Do whatever else you need afterwards
row.Tag = Entrykey;
Другие вопросы по тегам