Picturebox füllen

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von SystemUnknow.

    Picturebox füllen

    Hi,

    so das wird mein letzter Versuch für heute sein, Pic-Boxen zu füllen...

    Stelle mir folgendes vor:

    Habe in einem Panel 5 Pic-Boxen, in diesen Boxen sollen jpg Bilder angezeigt werden.
    Die Bilder sind in einem Ordner (E:\Vorschaubilder) drinnen, aber in diesen Ordner sind rund 100 Bilder vorhanden.

    Nun möchte ich diese Bilder in eine Art Array stecken, Bild 1-5 kann gleich angezeigt werden.
    Dann zwei Button, einer links einer recht, zurück und vor... drücke ich auf vor, soll Bild 2-6 in den 5 Pic-Boxen angezeigt werden.

    Muß ich das mit ner SChleife machen ?

    lris08 schrieb:

    Muß ich das mit ner SChleife machen ?

    Musst Du nicht , aber du kannst. Bei nur 5 Pictureboxen vielleicht erst einmal manuell

    VB.NET-Quellcode

    1. pic1.image=pic2.image: pic2.image=pic3.image:.....
    2. pic5.image= Bitmap.FromFile("pfadname")

    Bei grösserer Menge die Pictureboxen in ein Panel packen und über die Panel.Controls laufen
    ich würde mit eine schleife in Verzeichnis die Dateien von 1- 5 durchlaufen und die erste 5 bilder anzeigen.Um die nächsten 5 bilder anzusehen, einfach beim button click erhöchst du schleife !

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

    VB.NET-Quellcode

    1. Dim i As Integer
    2. For i = 0 To 5
    3. Me.Controls("Picturebox" & i).BackgroundImage = Bitmap.FromFile(reader("Doc_ThumbnailFullPfad").ToString())
    4. Next i


    so habe ich nun mal versucht den pfad einzulesen...

    Fehlermeldung:

    "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt"

    Voll daneben oder?

    ganze vode:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. ' --- Füllen Mappenobjekte Listview4
    2. con.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0; Data Source =" & Datenbankpfad & "\" & Datenbankname & ".mdb"
    3. cmd.CommandText = "SELECT * FROM " & TableName04 & " WHERE Doc_Mappennr = '" & DokMap_ID & "'"
    4. With ListView4
    5. .Columns.Clear()
    6. .Items.Clear()
    7. .FullRowSelect = True
    8. .View = View.Details
    9. .GridLines = True
    10. End With
    11. With ListView4.Columns
    12. .Add("ThumbsPfad", 0)
    13. .Add("Icon", 50)
    14. .Add("Art", 80)
    15. .Add("Doc.-Nr.", 200)
    16. .Add("Bezeichnung", 60)
    17. .Add("Doc.-Datum", 60)
    18. .Add("Aufbewahrungsfrist", 50)
    19. .Add("Größe", 50)
    20. .Add("ID", 0)
    21. End With
    22. Try
    23. con.Open()
    24. reader = cmd.ExecuteReader()
    25. ListView4.Items.Clear()
    26. 'ListView1.SmallImageList = ImageList1
    27. Do While reader.Read()
    28. Dim LItem2 As ListViewItem = ListView4.Items.Add(reader("Doc_ThumbnailFullPfad").ToString())
    29. LItem2.SubItems.Add(("Icon").ToString())
    30. LItem2.SubItems.Add(reader("Doc_Art").ToString())
    31. LItem2.SubItems.Add(reader("Doc_Dokumentennr").ToString())
    32. LItem2.SubItems.Add(reader("Doc_Bezeichnung").ToString())
    33. LItem2.SubItems.Add(reader("Doc_Datum").ToString())
    34. LItem2.SubItems.Add(reader("Doc_Aufbewahrungsfrist").ToString())
    35. LItem2.SubItems.Add(reader("Doc_Groesse").ToString())
    36. LItem2.SubItems.Add(reader("ID").ToString())
    37. Dim i As Integer
    38. For i = 0 To 5
    39. Me.Controls("Picturebox" & i).BackgroundImage = Bitmap.FromFile(reader("Doc_ThumbnailFullPfad").ToString())
    40. Next i
    41. Loop
    42. Catch ex As Exception
    43. MsgBox(ex.Message)
    44. Return
    45. Finally
    46. 'reader2.Close()
    47. con.Close()
    48. End Try

    VB.NET-Quellcode

    1. For i = 0 To 5
    2. Dim pb As PictureBox = DirectCast(Me.Controls("Picturebox" & i),PictureBox)
    3. If pb isnot nothing Then
    4. .BackgroundImage = Bitmap.FromFile(reader("Doc_ThumbnailFullPfad").ToString())
    5. End If
    6. Next i

    Option Strict ON :P
    außerdem glaube ich, dass es von 1 bis 5 sein sollte...
    Ich wollte auch mal ne total überflüssige Signatur:
    ---Leer---
    habe ich mich nicht deutlich ausgedruckt ich habe gemeint mit schleife die Dateien im Verzeichnis von 1 bis 5 durchlaufen.
    Der code von jbsl kannst du verwenden als zweite schleifen (innere schleife)

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

    lris08 schrieb:

    Voll daneben oder?
    Sagen wir mal halb daneben ...

    Ohne Deinen Code zu genau zu lesen: das Bild kannst Du ohne Reader direkt von der Platte lesen:

    VB.NET-Quellcode

    1. PictureBox1.Image = Bitmap.FromFile("d:\meinBild.bmp")

    lris08 schrieb:

    Me.Controls("Picturebox" & i).BackgroundImage
    kann nicht funktionieren, da die controls aus der ControlCollection erst einmal keine BackGroundImage Eigenschaft haben.

    So wird die ControlCollection der Form durchlaufen:

    VB.NET-Quellcode

    1. For Each c In Me.Controls
    2. If TypeOf c IsPicturebox Then
    3. Dim pic As Picturebox = DirectCast(c, picturebox)
    4. ' ab hier kannst Du alle Eigenschaften einer Picturebox verwenden
    5. End If
    6. Next

    Deswegen sagte ich ja Du solltest Deine PB in eine Panel packen: dort kannst Du dann sicher sein dass alle controls aus Panel.Controls wirklich Pictureboxen sind.

    Versteht das eigentlich ncoh jemand was ich sagen will ???? :wacko:

    jvbsl schrieb:

    VB.NET-Quellcode

    1. For i = 0 To 5
    2. Dim pb As PictureBox = DirectCast(Me.Controls("Picturebox" & i),PictureBox)
    3. If pb isnot nothing Then
    4. .BackgroundImage = Bitmap.FromFile(reader("Doc_ThumbnailFullPfad").ToString())
    5. End If
    6. Next i

    Option Strict ON :P
    außerdem glaube ich, dass es von 1 bis 5 sein sollte...



    so bleiben die Pic-Boxen leer....

    SystemUnknow schrieb:

    ja die bleiben auch leer...wocher sollen die bilder kommen...siehe meine post !


    Sorry, verstehe ich nicht...


    wird doch alles angegeben oder nicht?

    Und was meinst du mit zweite SChleife?

    VB.NET-Quellcode

    1. Do While reader.Read()
    2. Dim LItem2 As ListViewItem = ListView4.Items.Add(reader("Doc_ThumbnailFullPfad").ToString())
    3. LItem2.SubItems.Add(("Icon").ToString())
    4. LItem2.SubItems.Add(reader("Doc_Art").ToString())
    5. LItem2.SubItems.Add(reader("Doc_Dokumentennr").ToString())
    6. LItem2.SubItems.Add(reader("Doc_Bezeichnung").ToString())
    7. LItem2.SubItems.Add(reader("Doc_Datum").ToString())
    8. LItem2.SubItems.Add(reader("Doc_Aufbewahrungsfrist").ToString())
    9. LItem2.SubItems.Add(reader("Doc_Groesse").ToString())
    10. LItem2.SubItems.Add(reader("ID").ToString())
    11. Loop
    12. For i = 1 To 5
    13. Dim pb As PictureBox = DirectCast(Me.Controls("Picturebox" & i), PictureBox)
    14. If pb IsNot Nothing Then
    15. Me.Controls("Picturebox" & i).BackgroundImage = Bitmap.FromFile(reader("Doc_ThumbnailFullPfad").ToString())
    16. End If
    17. Next i
    18. Catch ex As Exception
    19. ....

    SystemUnknow schrieb:

    ja die bleiben auch leer...wocher sollen die bilder kommen...siehe meine post !

    Die Pfade kommen aus der Datenbank, wer hat Dich denn heute gebissen Alex ;)

    VB.NET-Quellcode

    1. For i = 1 To 5
    2. dim c as control= Me.Controls("Picturebox" & i)
    3. If c IsNot Nothing Then
    4. Dim pb As PictureBox = DirectCast(c, PictureBox)
    5. pb.BackgroundImage = Bitmap.FromFile(reader("Doc_ThumbnailFullPfad").ToString())
    6. End If
    7. Next i

    Wenn die weiter leerbleiben musst Du wohl mal mit dem Debugger rein und schauen was von der DB kommt. Du musst wohl auch den DB-reader in der schleife verändern
    @Kanagro: niemand...schlechte wetter..... :D ....so wie ich aus dem ersten post verstanden habe die bilder sind in einem verzeichnis und er will immer 5 bilder anzeigen lassen.....k.a was hat jetzt mit datenbank zu tun !
    Die Bilder sind in einem Ordner (E:\Vorschaubilder) drinnen, aber in diesen Ordner sind rund 100 Bilder vorhanden.

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

    BTT (Back to topic ) please
    @Iris hab jetzt Deinen Code mal angeschaut, das Ganze passt so noch nicht zusammen. Du willst ja eigentlich auf Knopfdruck folgendes machen wenn ich es richtig verstehe
    - 1(!!) neues Bild aus der DB lesen
    - die Images der PB neu füllen und zwar PB1=PB2, PB2=PB3, PB3=PB4, PB4=PB5
    - neuen Pfad aus dem aktuellen reader der DB füllen
    - PB5 aus diesem Pfad füllen

    Du liest aber momentan in der While-Schleife immer die gesamte DB durch. Lass das erstmal mit den Controls und stelle deinen Code um so dass er immer nur 1 neuen Pfad liest und fülle danach die PB manuell wie oben. Wenn die Programmlogik erst einmal stimmt dann können wir das umfüllen immer noch eleganter gestalten ...

    lris08 schrieb:

    SystemUnknow schrieb:

    Junge lerne erst mal grundlagen, lies wenigstens ein buch durch !


    sehr hilfreiche aussage!

    aber trotzdem danke für deine Hilfe, bin ja halt noch anfänger

    ...und tolle manieren hast "junge" ! im übrigen baumelt bei mir nix zwischen meinen beinen - verstanden?


    gut leserlich: Iris bin ich gerade
    und Alex ist mein Papa




    -> Hat ne Menge mit ner Datenbak zu tun, da die Pfade der Bilder in einer Datenbank stehen - nur die Bilder selbst stehen in einem Verzeichnis

    Ich denke dafür brauchst du Api

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

    habe noch ein mal den ganzen thread durch gelesen. Du speicherst Pfad und zugehörige Infos in einem Datenbank.
    Listview ist an datenbank angebunden, Daten in Listview zeigst du so an:

    VB.NET-Quellcode

    1. Dim LItem2 As ListViewItem = ListView4.Items.Add(reader("Doc_ThumbnailFullPfad").ToString())
    2. LItem2.SubItems.Add(("Icon").ToString())
    3. LItem2.SubItems.Add(reader("Doc_Art").ToString())
    4. LItem2.SubItems.Add(reader("Doc_Dokumentennr").ToString())
    5. LItem2.SubItems.Add(reader("Doc_Bezeichnung").ToString())
    6. LItem2.SubItems.Add(reader("Doc_Datum").ToString())
    7. LItem2.SubItems.Add(reader("Doc_Aufbewahrungsfrist").ToString())
    8. LItem2.SubItems.Add(reader("Doc_Groesse").ToString())
    9. LItem2.SubItems.Add(reader("ID").ToString())


    Nun du kannst eine schleife nemen, in Listview alle Einträge durchlaufen und die bilder in Picturebox anzeigen.
    Du wirst zwei schleifen brauchen, erste schleife zum durchlaufen von items in Listview und zweite schleife zu durchlaufen von controls. (verschachtelte schleifen)
    Ich habe jetzt keine VB!

    (Code aus kopf)

    VB.NET-Quellcode

    1. Dim i1 As Integer
    2. Dim i2 As Integer
    3. Din b As Integer
    4. For i1 = 0 to Listview.Items.Count -1
    5. b = b +1
    6. Listview.Items.Item = i1
    7. If b = 5 Then
    8. For i2 = 1 To 5
    9. dim c as control= Me.Controls("Picturebox" & i)
    10. If c IsNot Nothing Then
    11. Dim pb As PictureBox = DirectCast(c, PictureBox)
    12. pb.BackgroundImage = Bitmap.FromFile(reader("Doc_ThumbnailFullPfad").ToString())
    13. b = 0
    14. End If
    15. Next i1
    16. Next i2


    Die Logik sollte schon passen.....mal schauen vieleicht Kanagro hat besseren lösung !
    Über Eigenschaften/Methoden von listview schau noch mal in MSDN !

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „SystemUnknow“ ()