Forums Neueste Beiträge
 

ImageList - ListView

02/09/2008 - 07:53 von Karsten Sosna | Report spam
Hallo NG,
bin über ein merkwürdiges Verhalten gestolpert. Ich habe ein TabControl mit
2 Pages auf einem Formular. Auf der 2. TabPage befindet sich ein ListView.
Dazu folgender Code:
\\\
Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles MyBase.Load
ImageList1.ColorDepth = ColorDepth.Depth32Bit
ImageList1.ImageSize = New Size(96, 96)
ListView1.LargeImageList = ImageList1
ListView1.View = View.LargeIcon
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim key As String
Dim name As String

key = "aaa"
name = "C:\Temp\Infix1.png"
Using imgSrc = Image.FromFile(name)
ImageList1.Images.Add(key, imgSrc)
ListView1.Items.Add(name, key)
End Using

key = "bbb"
name = "C:\Temp\Infix2.png"
Using imgSrc = Image.FromFile(name)
ImageList1.Images.Add(key, imgSrc)
ListView1.Items.Add(name, key)
End Using
End Sub
///
Wenn ich nun die TabPage1 anzeige, den Button betàtige und dann auf die
TabPage2 wechseln will, erhalte ich eine ArgumentException. Zeige ich aber
erst die TabPage2 an, betàtgie den Button, scheint alles in Ordnung zu sein,
auch das Wechseln zwischen den TabPages funktioniert einwandfrei. Ich weiß
zwar wie man den Fehler umgehen kann, allerdings nicht warum das so sein
muss. So geht es nàmlich:
\\\
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As
System.EventArgs) Handles Button1.Click
Dim key As String
Dim name As String

key = "aaa"
name = "C:\Temp\Infix1.png"
Dim imgSrc = Image.FromFile(name)
ImageList1.Images.Add(key, imgSrc)
ListView1.Items.Add(name, key)

key = "bbb"
name = "C:\Temp\Infix2.png"
imgSrc = Image.FromFile(name)
ImageList1.Images.Add(key, imgSrc)
ListView1.Items.Add(name, key)

imgSrc = Nothing
End Sub
///
Man achte auf die Zuweisung von imgSrc, trotzdem werden beide Images richtig
dargestellt. Nur disposen darf man nicht! Komischerweise kann ich das aber
nur reproduzieren, wenn ich es wie oben beschrieben, mit einem TabControl
mache. Nehme ich einfach ein ListView(Visible =False), lade die Bilder und
schalte danach das ListView sichtbar, funktioniert es, auch mit Dispose oder
Using.
Hat jemand eine Erklàrung für das Verhalten?
Danke.
Gruß Scotty
 

Lesen sie die antworten

#1 Stefan Simon
12/09/2008 - 16:09 | Warnen spam
"Karsten Sosna" schrieb im Newsbeitrag
news:%

bin über ein merkwürdiges Verhalten gestolpert. [viel verwirrendes
Zeug...]



Ich weiß nicht, was du da beobachtet haben willst, aber das hat weder etwas
mit dem TabControl noch mit der ListView zu tun. Es ist eine Eigenheit der
ImageCollection, erst dann eine Kopie des Images zu erstellen, wenn das
Image abgerufen wird. Probiers aus:

Folgender Code schlàgt fehl:
\\\
Public Class Form1
Private imagelist1 As New ImageList
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim key As String
Dim name As String

key = "aaa"
name = "C:\Temp\brille.bmp"
Using imgSrc = Image.FromFile(name)
ImageList1.Images.Add(key, imgSrc)
End Using
MsgBox(ImageList1.Images("aaa").Height)
End Sub
End Class
///

Folgender ebenfalls, da "end using" den Verweis auf das Image zerstört,
bevor eine Kopie erzeugt werden konnte:
\\\
Public Class Form1
Private imagelist1 As New ImageList
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim key As String
Dim name As String

key = "aaa"
name = "C:\Temp\brille.bmp"
Using imgSrc = Image.FromFile(name)
imagelist1.Images.Add(key, imgSrc)
End Using
Dim img As Image = imagelist1.Images(key)
MsgBox(img.Height)
End Sub
End Class
///

Folgendes hingegen funktioniert:
\\\
Public Class Form1
Private imagelist1 As New ImageList
Private Sub Form1_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
Dim key As String
Dim name As String

key = "aaa"
name = "C:\Temp\brille.bmp"
Using imgSrc = Image.FromFile(name)
ImageList1.Images.Add(key, imgSrc)
Dim img As Image = imagelist1.Images(key)
End Using
MsgBox(ImageList1.Images("aaa").Height)
End Sub
End Class
///

Ähnliche fragen