Я использую Visual Studio 2010 и кодирую на VB.

Я получаю каталоги в папке для заполнения ListView, и у меня нет проблем с этим. Я также могу добавить изображения в ImageList, выполнив поиск файлов в папке. Я не могу соединить их. Если я жестко закодирую свои элементы и жестко закодирую свои изображения, они будут работать нормально.

Мне также нужно выяснить, как добавить тег для каждого элемента. Тег должен быть именем каталога. (реж из первого для каждого)

Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

    'Set ListView view mode to show Large Icons
    ListView1.View = View.LargeIcon

    Dim dirs As String() = Directory.GetDirectories(filePath & "Resources\IETMS\")
    Dim dir As String

    For Each dir In dirs
        dir = dir.Replace(dir.Substring(0, dir.LastIndexOf("\") + 1), "")
        ListView1.Items.Add(New ListViewItem(dir))
    Next

    'Create ImageList objects. 
    Dim imageListLarge As New ImageList()
    imageListLarge.ImageSize = New Size(100, 100)

    Dim filesList As String() = Directory.GetFiles(filePath & "Resources\IETMS\")
    Dim files As String
    For Each files In filesList
        'files = files.Replace(files.Substring(0, files.LastIndexOf("\") + 1), "")
        imageListLarge.Images.Add(Bitmap.FromFile(files))
    Next

    'Assign the ImageList objects to the ListView.
    ListView1.LargeImageList = imageListLarge

End Sub

Вот тот же код, но информация жестко закодирована. Следующий пример работает именно так, как я хочу. Единственная проблема в том, что у некоторых клиентов могут быть все 6 предметов, а у некоторых - нет. Это причина, по которой вам нужен For Each.

Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'Set ListView view mode to show Large Icons
        ListView1.View = View.LargeIcon

        ' Create items for the listview
        Dim item1 As New ListViewItem("Item 1", 5)
        Dim item2 As New ListViewItem("Item 2", 4)
        Dim item3 As New ListViewItem("Item 3", 0)
        Dim item4 As New ListViewItem("Item 4", 3)
        Dim item5 As New ListViewItem("Item 5", 1)
        Dim item6 As New ListViewItem("Item 6", 2)

        'Set the group for the items
        item1.Group = ListView1.Groups("IETMs")
        item2.Group = ListView1.Groups("IETMs")
        item3.Group = ListView1.Groups("IETMs")
        item4.Group = ListView1.Groups("IETMs")
        item5.Group = ListView1.Groups("IETMs")
        item6.Group = ListView1.Groups("IETMs")

        'Set a tag for the items
        item1.Tag = "This is file 1"
        item2.Tag = "This is file 2"
        item3.Tag = "This is file 3"
        item4.Tag = "This is file 4"
        item5.Tag = "This is file 5"
        item6.Tag = "This is file 6"

        'Add the items to the ListView.
        ListView1.Items.AddRange(New ListViewItem() {item1, item2, item3, item4, item5, item6})

        'Create ImageList objects. 
        Dim imageListLarge As New ImageList()
        imageListLarge.ImageSize = New Size(100, 100)

        ' Initialize the ImageList objects with bitmaps
        Dim image1 = Bitmap.FromFile(filePath & "Resources\IETMS\file1.ico")
        Dim image2 = Bitmap.FromFile(filePath & "Resources\IETMS\file2.ico")
        Dim image3 = Bitmap.FromFile(filePath & "Resources\IETMS\file3.ico")
        Dim image4 = Bitmap.FromFile(filePath & "Resources\IETMS\file4.ico")
        Dim image5 = Bitmap.FromFile(filePath & "Resources\IETMS\file5.ico")
        Dim image6 = Bitmap.FromFile(filePath & "Resources\IETMS\file6.ico")

        imageListLarge.Images.AddRange({image1, image2, image3, image4, image5, image6})

        'Assign the ImageList objects to the ListView.
        ListView1.LargeImageList = imageListLarge

    End Sub

Вот мой модифицированный код.

Private Sub frmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load

        'Set ListView view mode to show Large Icons
        ListView1.View = View.LargeIcon

        Dim dirs As String() = Directory.GetDirectories(filePath & "Resources\IETMS\")
        Dim dir As String

        For Each dir In dirs
            dir = dir.Replace(dir.Substring(0, dir.LastIndexOf("\") + 1), "")
            ListView1.Items.Add(New ListViewItem(dir, dir))
        Next

        'Create ImageList objects. 
        Dim imageListLarge As New ImageList()
        imageListLarge.ImageSize = New Size(100, 100)

        Dim filesList As String() = Directory.GetFiles(filePath & "Resources\IETMS\")
        Dim files As String
        Dim files2 As String

        For Each files In filesList
            files2 = files.Replace(files.Substring(0, files.LastIndexOf("\") + 1), "")
            files2 = files2.Replace(".ico", "")
            imageListLarge.Images.Add(files2, Bitmap.FromFile(files))
        Next

        'Assign the ImageList objects to the ListView.
        ListView1.LargeImageList = imageListLarge

    End Sub
2
xRuhRohx 13 Янв 2014 в 19:42

1 ответ

Лучший ответ

Элементы коллекции ImageList также могут иметь ключ для удобного поиска:

imageListLarge.Images.Add(files, Bitmap.FromFile(files)))

Затем вы можете ссылаться на них по ключу:

Dim bmp As Bitmap = imageListLarge.Images("my file name")

Когда вы добавляете свой элемент ListView, вы можете использовать ImageKey в качестве ссылки:

Dim item1 As New ListViewItem("2J-F108-100", "2J-F108-100")

Это предполагает, что вы добавили изображение с тем же ключом:

imageListLarge.Images.Add("2J-F108-100", Bitmap.FromFile(...)))

Также не забудьте добавить свои изображения перед добавлением ListItems:

Dim imageListLarge As New ImageList()
imageListLarge.ImageSize = New Size(100, 100)
Dim filesList As String() = Directory.GetFiles(filePath & "Resources\IETMS\")
Dim files2 As String
For Each files As String In filesList
  files2 = files.Replace(files.Substring(0, files.LastIndexOf("\") + 1), "")
  files2 = files2.Replace(".ico", "")
  imageListLarge.Images.Add(files2, Bitmap.FromFile(files))
Next
ListView1.LargeImageList = imageListLarge

ListView1.View = View.LargeIcon
Dim dirs As String() = Directory.GetDirectories(filePath & "Resources\IETMS\")
For Each dir As String In dirs
  dir = dir.Replace(dir.Substring(0, dir.LastIndexOf("\") + 1), "")
  ListView1.Items.Add(New ListViewItem(dir, dir))
Next
1
LarsTech 13 Янв 2014 в 22:16
Не совсем уверен, как это мне помогает. Если бы вы могли объяснить, что это может сделать в моей ситуации, я был бы признателен. И я благодарю вас за ваш вклад.
 – 
xRuhRohx
13 Янв 2014 в 20:09
Обновил пост. Вы не хотите использовать значение индекса для связывания изображений, вы хотите использовать ключ. Независимо от того, используете ли вы имя файла или свой собственный ключ, решать вам.
 – 
LarsTech
13 Янв 2014 в 20:19
Хорошо, я понимаю. У меня заполнен ListView и заполнен imageList. Но изображения все еще не отображаются для меня. В любом случае, чтобы увидеть, совпадают ли они во время работы? Как пройтись по обоим спискам и посмотреть, совпадают ли они?
 – 
xRuhRohx
13 Янв 2014 в 21:29
Я прошел через ListView, и он показал все элементы, а ImageList показывает 6 элементов, что является правильным количеством элементов, но мои изображения просто не отображаются.
 – 
xRuhRohx
13 Янв 2014 в 21:50
Что ж, я не понимаю, что ты сделал. Какой «ключ» вы используете для своих изображений и какой ключ вы используете для свойства ImageKey ListViewItem?
 – 
LarsTech
13 Янв 2014 в 21:51