Hi Ihr,
ich hatte echt Probleme, die ich nicht nachvollziehen kann.
Hintergrund:
Ich habe eine DatagridView in welcher wie schon beschrieben, die Inhalte der in dem Treeview ausgewählten Ordner angezeigt werden.
In der ersten Spalte dieser DGV zeige ich das Datei-Symbol an, welches ich aus der Dateiinfo auslese.
Leider dauert eben dieses Auslesen und extrahieren der Datei-Symbole ein halbe Ewigkeit.
Bei 1000 enthaltenen Dateien dauert es 30Sekunden, die DGV zu befüllen (ohne Symbole gerade mal 5 Sekunden).
Nun dachte ich, ich mache es ganz schlau und lese die Symbole beim ersten Einlesen der Objektliste gaaaaaanz langsam in eine Liste "iconDictionary" mit Inhalt "Dateipfad,Bitmap" ein.
Wird der Ordner aber erneut geöffnet, werden die Datei-Symbole dann retzfatz aus der Liste gelesen, was extrem schneller abläuft (bei 1000 Einträgen 5 sek.).
Das habe ich dann auch so zusammengeschwartet - und dann aber beim Einlesen der Liste laufend GDI+-Fehler bekommen.
Diesen Fehler habe ich (hoffentlich) erledigt, indem ich das Bitmap aus der Liste "clone" und den Clone in meine DGV einbinde.
Gibt es keine elegantere und vor allem schnellere Lösung, um
direkt zu erzeugen, als den Umweg über den g-Clone?
Bei dieser direkten Zuweisung ist bei wiederholtem Aufruf (ordner und Objektliste neu einlesen) immer der "Allgemeine GDI+"-Fehler aufgetreten.
Mit dem Clonen
scheint es stabil zu laufen.
Aber hübsch und nachvollziehbar ist was anderes.
Ich denke, da ist irgendwas am Format der Bitmap aus der Liste in iconDictionary faul.
Hat mir da vielleicht jemand einen Tip, warum die einfache Zuweisung mit der Zeit Amok läuft und ob ich das auch schneller und schöner zurechtschnipseln kann?
Beste Grüsse
ich hatte echt Probleme, die ich nicht nachvollziehen kann.
Hintergrund:
Ich habe eine DatagridView in welcher wie schon beschrieben, die Inhalte der in dem Treeview ausgewählten Ordner angezeigt werden.
In der ersten Spalte dieser DGV zeige ich das Datei-Symbol an, welches ich aus der Dateiinfo auslese.
Leider dauert eben dieses Auslesen und extrahieren der Datei-Symbole ein halbe Ewigkeit.
Bei 1000 enthaltenen Dateien dauert es 30Sekunden, die DGV zu befüllen (ohne Symbole gerade mal 5 Sekunden).
Nun dachte ich, ich mache es ganz schlau und lese die Symbole beim ersten Einlesen der Objektliste gaaaaaanz langsam in eine Liste "iconDictionary" mit Inhalt "Dateipfad,Bitmap" ein.
Wird der Ordner aber erneut geöffnet, werden die Datei-Symbole dann retzfatz aus der Liste gelesen, was extrem schneller abläuft (bei 1000 Einträgen 5 sek.).
Das habe ich dann auch so zusammengeschwartet - und dann aber beim Einlesen der Liste laufend GDI+-Fehler bekommen.
Diesen Fehler habe ich (hoffentlich) erledigt, indem ich das Bitmap aus der Liste "clone" und den Clone in meine DGV einbinde.
VB.NET-Quellcode
- Try
- dgv_Files.RowTemplate.Height = DesignArray(My.Settings.Oberfläche_Design * 10 + 5).Schriftart.Height + 6
- Dim DateiListe As New List(Of String)
- FindAllFiles(OrdnerPfad, "*.*", DateiListe)
- ' Icons in IconDictionary einlesen, falls nicht vorhanden
- For Each datei As String In DateiListe
- If My.Settings.Listen_Objektliste_AnzeigeSymbole AndAlso Not iconDictionary.ContainsKey(datei) Then
- Dim icon As Bitmap = ExtractIconFromFile(datei)
- If icon IsNot Nothing Then
- iconDictionary(datei) = icon
- End If
- End If
- Next
- Dim LeerIcon = New Bitmap(CInt(dgv_Files.Font.Size + 10), CInt(dgv_Files.Font.Size + 10))
- Dim resizedIcon As Bitmap = LeerIcon
- For Each datei As String In DateiListe
- resizedIcon = LeerIcon
- dArt = IsRegisteredExtension(datei)
- If IO.Path.GetFileName(datei).ToLower <> ObjektEinstellungenXML.ToLower Then
- If datei.Length < 261 Then
- Dim fileDetail As FileInfo = My.Computer.FileSystem.GetFileInfo(datei)
- If My.Settings.Listen_Objektliste_AnzeigeSymbole Then
- Dim icon As Bitmap = Nothing
- If dArt > 8 Then
- icon = My.Resources.Schlüssel.ToBitmap()
- ElseIf iconDictionary.ContainsKey(datei) Then
- Dim iconFromDict As Bitmap = iconDictionary(datei)
- If iconFromDict IsNot Nothing Then
- icon = New Bitmap(iconFromDict.Width, iconFromDict.Height)
- Using g As Graphics = Graphics.FromImage(icon)
- g.DrawImage(iconFromDict, New Rectangle(0, 0, icon.Width, icon.Height))
- End Using
- Else
- icon = LeerIcon
- End If
- Else
- icon = LeerIcon
- End If
- If icon IsNot Nothing Then
- resizedIcon = New Bitmap(icon, CInt(dgv_Files.Font.Size + 10), CInt(dgv_Files.Font.Size + 10))
- icon.Dispose()
- End If
- End If
- dgv_Files.Rows.Add(resizedIcon,
- IO.Path.GetFileName(datei),
- DateiEndungTypBezeichnung(LCase(IO.Path.GetExtension(datei))),
- fileDetail.Length,
- fileDetail.LastWriteTime,
- fileDetail.LastAccessTime,
- fileDetail.CreationTime)
- Else
- Dim form_exclamation As New ICE_Eingabe
- form_exclamation.Initialisiere(False, My.Resources.ICE_Common_ICEFehler, String.Format(My.Resources.ICE_Common_Fehler_Pfadlänge, datei), MessageBoxButtons.OK, 4,, False)
- End If
- End If
- Next
- Catch ex As System.Exception
- Me.Cursor = Cursors.Default
- Dim form_exclamation As New ICE_Eingabe
- form_exclamation.Initialisiere(False, My.Resources.ICE_Common_ICEFehler, String.Format(My.Resources.ICE_Common_FehlerInModul, "create_DGV_Files", ex.Message), MessageBoxButtons.OK, 4,, False)
- End Try
Gibt es keine elegantere und vor allem schnellere Lösung, um
direkt zu erzeugen, als den Umweg über den g-Clone?
Bei dieser direkten Zuweisung ist bei wiederholtem Aufruf (ordner und Objektliste neu einlesen) immer der "Allgemeine GDI+"-Fehler aufgetreten.
Mit dem Clonen
VB.NET-Quellcode
- Dim iconFromDict As Bitmap = iconDictionary(datei)
- If iconFromDict IsNot Nothing Then
- icon = New Bitmap(iconFromDict.Width, iconFromDict.Height)
- Using g As Graphics = Graphics.FromImage(icon)
- g.DrawImage(iconFromDict, New Rectangle(0, 0, icon.Width, icon.Height))
- End Using
- Else
- icon = LeerIcon
- End If
scheint es stabil zu laufen.
Aber hübsch und nachvollziehbar ist was anderes.
Ich denke, da ist irgendwas am Format der Bitmap aus der Liste in iconDictionary faul.
Hat mir da vielleicht jemand einen Tip, warum die einfache Zuweisung mit der Zeit Amok läuft und ob ich das auch schneller und schöner zurechtschnipseln kann?
Beste Grüsse