Bilder in Imagelist und Listview

  • VB.NET

Es gibt 27 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Bilder in Imagelist und Listview

    Hallo,

    Ich versuche gerade alle Bilder eines Ordners mit Hilfe einer Imagelist in ein Listview zu laden.

    VB.NET-Quellcode

    1. Dim bilder() As String = System.IO.Directory.GetFiles("C:\Users\RSC\Desktop\Neuer Ordner", "*.jpg")
    2. Dim i As Integer = 0
    3. ListView1.Items.Clear()
    4. For Each File As String In bilder
    5. ImageList1.Images.Add(i, Image.FromFile(File))
    6. ListView1.Items.Add(File, i)
    7. i += 1
    8. Next File


    Dies Funktioniert auch mehr oder weniger.

    Nun sind die Bilder sehr klein und der Pfad wird noch darunter angezeigt.

    Kann man die Bilder grösser mache und den Pfad ausblenden?


    Grundsätzlich noch eine Frage, Ist dies eine kluge Variante wenn ich anschliessend ein Ausgewähltes Bild im Ordner löschen möchte?

    schnibli schrieb:

    Kann man die Bilder grösser mache und den Pfad ausblenden?

    Ja, kann man. Ist dann aber nicht mehr trivial.

    Zum Pfad: Da ist es vielleicht geschickter, nicht Directory.GetFiles() zu nutzen, sondern ein DirectoryInfo-Objekt zu erzeugen und dann daraus die FileInfo-Objekte zu beziehen. Diese haben dann u.a. auch Eigenschaften um den Dateinamen ohne Pfad zu erhalten, die du dann zum Erstellen der ListViewItems benutzt. Oder du benutzt alternativ IO.Path.GetFileName(), dann brauchst du den anderen Code für das Ermitteln der Dateien nicht zu ändern.

    Zur Bildgröße: Das ListView hat hier festdefinierte Größen, abhängig vom gewählten ViewStyle. Ich nehme mal an, du nutzt bereits den Style "LargeIcon", das sind aber eben nur "normal große Icons", d.h. 32x32 Pixel. Hier kannst du ggf. auf den ViewMode "Tile" wechseln, da hast du die Möglichkeit die Größe pro Element nach Wunsch anzupassen (TileSize-Eigenschaft).
    Ich hab allerdings nicht ausprobiert, wie ein ListView per ImageList referenzierte Bilder in diesem Modus behandelt, ob es diese also in der Tile-Größe darstellt. Reicht dir das Ergebnis nicht aus, besteht aber die Möglichkeit, die Eigenschaft OwnerDraw auf True zu setzen, dann bist du allerdings für das Zeichnen deiner ListViewItems selbst verantwortlich und musst einen Handler für das DrawItem-Event implementieren. Dort kannst du dann deine Bilder in beliebiger Größe zeichnen, orientierst dich dabei aber am besten an der Eigenschaft Bounds des übergebenen DrawListViewItemEventArgs-Objekt.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Um die Grösse Anzupassen habe ich auf "view.tile" gewechselt
    und in der imagelist den imagesitze auf 128 x 128 eingestellt.

    Funktioniert Wunderbar.

    Nun zu leider schaffe ich das nichtdas nur das bild und kein Name Angezeigt wird.

    schnibli schrieb:

    Nun zu leider schaffe ich das nichtdas nur das bild und kein Name Angezeigt wird.


    VB.NET-Quellcode

    1. ListView1.Items.Add(File, i)

    =>

    VB.NET-Quellcode

    1. ListView1.Items.Add("", i)

    Falls du den Namen aber später noch brauchen solltest, kannst du ihn z.B. auch der Tag-Eigenschaft des ListViewItems zuweisen:

    VB.NET-Quellcode

    1. Dim lvi = ListView1.Items.Add("", i)
    2. lvi.Tag = File
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Du bist ja 1A mit listview's :)...

    Ja den brauche ich sogar ... das währe der nächste Schritt ... und zwar würde ich gerne die Selectierten Bilder aus dem Ordner löschen und anschlissend Aktuallisieren.

    schnibli schrieb:

    und zwar würde ich gerne die Selectierten Bilder aus dem Ordner löschen und anschlissend Aktuallisieren.

    Dazu gibt es folgenden Weg:
    • Mit einer For-Schleife durch alle Listview.Items durchgehen.
    • Dann eine If-Abfrage für Listview.Items(x).selected = true.
    • Und anschließend dann ein File.Delete für Listview.Items(x).tag [<Dateipfad]
    Es soll mir alle Bilder eines Ordners auflisten. -> Funktioniert
    Es sollen Bilder in den Ordner kopiert werden.-> Funktioniert
    Es sollen Bilder über das Listview gelöscht werden können. -> Error :)

    VB.NET-Quellcode

    1. Sub loeschen()
    2. For Each del As String In ListView1.Items
    3. If ListView1.Items(del).Selected = True Then
    4. File.Delete(ListView1.Items(del).Tag)
    5. End If
    6. Next
    7. End Sub



    Fehler.
    Ein Ausnahmefehler des Typs "System.InvalidCastException" ist in Microsoft.VisualBasic.dll aufgetreten.

    Zusätzliche Informationen: Ungültige Konvertierung von Typ ListViewItem in Typ String.
    Exceptions, und was sie uns sagen wollen - Abschnitt "InvalidCastException 2"

    im Webbrowser-Control wäre die Lösch-Funktionalität schon drinne, und würde nicht nur aus dem Dateisystem gelöscht, sondern auch vom "ListView"

    na - vlt. doch auch unbrauchbar, weil WebBrowser würde jede Art von Datei anzeigen und bearbeitbar machen :(

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Du schreibst das so:
    [s]For Each del As String In ListView1.Items

    Dann schau dir diese Meldung an:
    Ungültige Konvertierung von Typ ListViewItem in Typ String.


    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    Nimm die Definierung der Variablen raus:
    For Each del In ListView1.Items

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Don_Batisto“ ()

    Jetzt kommt die nächste fehlermeldung :)

    Ein Ausnahmefehler des Typs "System.Reflection.AmbiguousMatchException" ist in Microsoft.VisualBasic.dll aufgetreten.

    Zusätzliche Informationen: Fehler beim Auflösen der Überladung. Kein Public Item kann mit diesen Argumenten aufgerufen werden:

    ErfinderDesRades schrieb:

    Welcher Datentyp ist in ListView1.Items drinne?

    schnibli schrieb:

    Die Daten werden über eine ImageList1 in das listview eingeladen.

    Das ist auch nicht die Antwort.
    Bewege den Cursor auf das Wort "Items" in der Zeile For Each ... in ListView1.Items und drücke F1. Nach der folgenden Lektüre würden wir gerne von dir wissen, welchen Datentyp ListView1.Items hat und welchen Datentyp demzufolge deine For-Each-Variable haben muss.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Diese Antwort werte ich mal als "nein - keine Idee, wo nachgucken"

    Ich komme mir bei manchen VBP-Usern schon regelrecht verhasst vor, weil ich ständig den ObjectBrowser empfehle, aber nützt halt nix: Da kann man nachgucken, welcher Datentyp in ListView1.Items drinne ist.
    Und dann kann man die Schleife aus post#8 vlt. auch zum laufen bringen, weil bei

    VB.NET-Quellcode

    1. For each del As ??? in ListView1.Items
    muss man den richtigen Datentyp angeben, sonst InvalidCast-Exception.

    Edit:
    @Arby:: ja, oder mit F1

    Edit Edit:
    nein - meine F1 - also ich wollte dir damit zustimmen, weil MSDN (F1) ist eine zum ObjectBrowser (F2) alternative Dokumentation - mit bisserl anderem Schwerpunkt, aber auch vollständig.
    @TE: Übriges kriegt man den OB-Eintrag auch ganz ähnlich direkt aus dem Code-Editor: Statt F1 drücken per Rechtsklick-"Zu Definition gehen".

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    ErfinderDesRades schrieb:

    ja, oder mit F1

    Ich geh mal davon aus du meinst hier "F2". (Edit: Ach so... ok, das "oder" falsch interpretiert)

    Zum reinen Nachschlagen des Datentyps sicher einfacher, ich setzte hier auf den Lerneffekt, da in der Hilfe doch meist noch ein paar zusätzliche Informationen enthalten sind, u.a. z.B. auch Beispiele wie man durch so eine Liste von Items iterieren kann und so Scherze... ;)
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Arby“ ()