Listview für pictures

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von Peter329.

    Listview für pictures

    Hi,

    ich möchte gern eine Listview programmieren, die mir alle Bilder eines Verzeichnisses in einer Vorschau anzeigt. So habe ich das versucht:

    VB.NET-Quellcode

    1. Private Sub LoadTiles(myPath As String)
    2. Dim fileEntries As String() = Directory.GetFiles(myPath)
    3. Dim fileObject As String
    4. Dim fileName As String
    5. Dim fileExtension As String
    6. Dim ImageList1 As New ImageList
    7. ListView1.LargeImageList = ImageList1
    8. ImageList1.ImageSize = New Size(200, 200)
    9. ListView1.LabelEdit = True
    10. ListView1.View = View.Tile
    11. ListView1.TileSize = New Point(250, 250)
    12. ListView1.Clear()
    13. Dim i As Integer = -1
    14. For Each fileObject In fileEntries
    15. fileName = Path.GetFileName(fileObject)
    16. fileExtension = Path.GetExtension(fileObject).ToLower
    17. If ".jpg, .bmp, .png, . ico".Contains(fileExtension) Then
    18. i += 1
    19. ImageList1.Images.Add("imagekey" & i.ToString, Image.FromFile(fileObject))
    20. ListView1.Items.Add(fileName, "imagekey" & i.ToString)
    21. End If
    22. Next fileObject
    23. End Sub


    Das Ergebnis ist leider nicht so ganz das was ich haben möchte (s. Anhang)

    1. Die "fileNames" sollten unter dem Vorschaubild stehen (und nicht rechts daneben). Wie kann ich das denn einstellen ?

    2. Die Qualität der Vorschaubilder leidet ganz erheblich. Die Formen sind prima aber die Farben sind teilweise ziemlich daneben. Wid kann ich denn die Qualität verbessern ?

    3. Meine Vorschaubilder sind alle quadratisch. Das dürfte mit ein Grund für die schlechte Qualität sein. Gäbe es denn eine Möglichkeit die Proportionen zu erhalten ?

    Ich bin mir nicht so ganz sicher, ob meine Codierung überhaupt so ganz "koscher" ist ... vor allem die Sache mit der Zuweisung eines imagekeys sieht mir zweifelhaft aus.

    Na, ich bin sicher, dass ihr mir freundlich und nachsichtig auf die Sprünge helfen könnt.

    LG
    Peter
    Bilder
    • s 2018-06-06 09-43-521.jpg

      45,78 kB, 594×665, 113 mal angesehen
    Also ist eine ListView für mein Vorhaben nicht geeignet. Ich hatte mir sowas schon gedacht. Schade, denn die Sache mit der automatischen Aufteilung mittels "Tile" sah ja schon recht gut aus.

    Das mit dem Flowlayoutpanel klingt nicht schlecht. Obwohl ich mit so einem Dingens noch nie gerarbeitet habe.

    Hmm ... also da müsste ich zuerst mal ein Nutzersteuerelement bauen, das eine PictureBox und darunter eine TextBox enthält.

    Wie mache ich das denn ?

    Und dann müsste ich in das Flowlayoutpanel eine variable Anzahl von diesen Elementen mit .Add einbauen und die entsprechenden Eigenschaften setzen, damit die Elemente wie mit Tile angezeigt werden. Das scheint machbar ...

    VB.NET-Quellcode

    1. Private Sub LoadTiles(myPath As String)
    2. Dim fileEntries As String() = Directory.GetFiles(myPath)
    3. Dim fileObject As String
    4. Dim fileName As String
    5. Dim fileExtension As String
    6. FlowLayoutPanel1.FlowDirection = FlowDirection.LeftToRight
    7. FlowLayoutPanel1.WrapContents = True
    8. For Each fileObject In fileEntries
    9. fileName = Path.GetFileName(fileObject)
    10. fileExtension = Path.GetExtension(fileObject).ToLower
    11. If ".jpg, .bmp, .png, .ico".Contains(fileExtension) Then
    12. Dim myPicbox As New PictureBox
    13. myPicbox.Size = New Size(200, 200)
    14. myPicbox.SizeMode = PictureBoxSizeMode.Zoom
    15. myPicbox.Image = Image.FromFile(fileObject)
    16. FlowLayoutPanel1.Controls.Add(myPicbox)
    17. Dim myLabel As New Label
    18. myLabel.Text = fileName
    19. FlowLayoutPanel1.Controls.Add(myLabel)
    20. End If
    21. Next fileObject
    22. End Sub


    Ich habe jetzt einfach eine PictureBox und ein Label in das FlowLayoutPanel eingefügt ... natürlich stehen die dann nebeneinander. Das fehlt eben noch das benutzerdefinierte Control.

    Vielleicht kann mir jemand sagen, wie man das macht ... eine PictureBox und ein Label in ein Control zu kombinieren. Nehme ich da eine GroupBox ?
    Bilder
    • s 2018-06-06 15-27-371.jpg

      36,2 kB, 955×475, 112 mal angesehen

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Peter329“ ()

    @Peter329 Warum nimmst Du kein DataGridView?
    DgvImageSaveLoad.zip
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Also ... ich hab das mit dem "Composite Control" versucht ... aber das ist ziemlich harte Kost. Ich kann zwar die Lib erstellen, mit einem Control, das eine PicBox und ein Label enthält, aber das Dingens dann in mein Projekt einzubinden, daran scheitere ich.

    Warum keine Dgv ? Hmmm ... gibt es denn in der DatagridView eine "Tile" Option ? Also eine Option, mit der man erreicht, dass sich die Spaltenanzahl der angezeigten Bildchen automatisch an die Fenstergröße anpasst. Und dass man das mit einer ScrollBar verschieben kann ... Wie in der Icon Ansicht beim Windows Explorer ...

    Ich hab dein Projekt heruntergeladen ... in der darin enthaltenen dgv wird Text und Grafik zeilenweise angezeigt. Das ist aber nicht das, was ich hier möchte. Oder übersehe ich da etwas ...
    Nachdem ich die Sache mit den Composite Controls nicht hinbekommen habe, hab ich das nun wie folgt gelöst:

    Ich habe ein Panel definiert und diesem Panel eine PictureBox und ein Label hinzugefügt. Und dann diese beiden Controls im Panel händisch positioniert und konfiguriert.

    Und dieses Panel habe ich dann meinem FlowLayoutPanel hinzugefügt.

    Natürlich muss man jetzt noch mit AddHandler entsprechende Ereignisroutinen hinzufügen (sonst reagieren die Controls nicht). Danach verhält sich die Sache aber sehr manierlich !


    Vielen Dank erst mal an die Ratgeber.

    @EDR: Danke für dein Code Beispiel. Das scheint dann ja so zu sein, dass man die Sache auch mit einer ListView hinbekommt. Ich schau mir das mal alternativ an !

    Einen schönen Abend und

    LG
    Peter