Welcher Aufbau für "variable" Bildervorschau

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von stepper71.

    Welcher Aufbau für "variable" Bildervorschau

    Hallo,

    Ich möchte Bilddateien, die in einer Filestreamtabelle gespeichert sind, in einer "variablen" Vorschau darstellen.
    D.h. die Vorschau soll so ähnlich wie im Windowsexplorer bei der Ansicht mit den großen Symbolen aussehen, quasi eine zweidimensionale Marix.
    Funktionen um die Thumbnails zu erstellen habe ich bereits.

    Ich bräuchte jetzt nur ein Objekt in dem ich die ganzen Vorschaubilder anzeigen kann.
    Wenn dann das Formular größer gezogen wird sollen auch entsprechend mehr Vorschaubilder angezeigt werden, also keine statische Spalten/Zeilenvorgabe.

    Habe mir ein paar Beispiele mit einem DatagridView angeshen, das (scheint) aber nicht zu funktionieren (feste Spaltenanzahl).

    Wie würde man das grundsätzlich angehen?

    Gruß
    Stepper
    @stepper71:: Du suchst ein FlowLayoutPanel.
    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!

    stepper71 schrieb:

    Habe mir ein paar Beispiele mit einem DatagridView angeshen, das (scheint) aber nicht zu funktionieren (feste Spaltenanzahl).


    DataGridViews haben keine feste Spaltenanzahl. Mit DataGridView.Columns.Add kannst du neue hinzufügen.
    Aber bei deinem speziellen Anlass, wäre ein FlowLayoutPanel wohl sinvoller, wie RodFromGermany bereits erwähnte.

    stepper71 schrieb:

    Oder muss ich Controls (z.B. PictureBox) in das Panel packen
    Was haben Deine Versuche und Recherchen ergeben?
    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!
    Meine Suche hat ergeben das meistens empfohlen wird Bilder in einem FlowLayoutPanel mit Picturebox controls darzustellen.
    Also habe ich mal folgendes Versucht:

    VB.NET-Quellcode

    1. Dim newcontrol As New PictureBox
    2. With newcontrol
    3. .Name = "picBild1"
    4. .Height = 50
    5. .Width = 50
    6. .BorderStyle = BorderStyle.FixedSingle
    7. .Load("c:\temp\bilder\bild.jpg")
    8. End With
    9. FlowLayoutPanel1.Controls.Add(newcontrol)


    Was auch funktioniert.
    Was mich verwirrt: Ich kann mehrmals auf diesen code aufrufen und es werden immer mehr Picturebox Controls eingefügt, alle mit dem Bild.
    Warum komme ich dann keine Fehlermeldung? Die Controls heißen in diesem Beispiel doch alle gleich?
    Und wie würde ich dann die einzelnen Controls ansprechen wenn Sie alle gleich heißen?

    stepper71 schrieb:

    wenn Sie alle gleich heißen
    sprich sie über den Index an.
    Natürlich ist es besser, ihnen verschiedene Namen zu geben. Oder nutze die Tag-Property.
    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!
    Hatte das Problem das ich es nicht hinbekommen habe die Objekte in dem FlowLayoutPanel direkt anzusprechen.
    Eine "Lösung" die ich gefunden habe geht über einen Handler.
    Das ganze sieht dann so aus:

    VB.NET-Quellcode

    1. Private Sub cmdFlowLayoutPanel_Click(sender As Object, e As EventArgs) Handles cmdFlowLayoutPanel.Click
    2. Dim newcontrol As New PictureBox
    3. AddHandler newcontrol.Click, AddressOf Bild_ausgewählt
    4. With newcontrol
    5. .Name = "picBild1"
    6. .Height = 50
    7. .Width = 50
    8. .BorderStyle = BorderStyle.FixedSingle
    9. .Load("c:\temp\bilder\bild.jpg")
    10. End With
    11. FlowLayoutPanel1.Controls.Add(newcontrol)
    12. End Sub
    13. Private Sub Bild_ausgewählt(ByVal sender As Object, e As EventArgs)
    14. Dim picBox As New PictureBox
    15. If TypeOf sender Is PictureBox Then
    16. picBox = CType(sender, PictureBox)
    17. MessageBox.Show("Name: " & picBox.Name)
    18. End If
    19. End Sub


    Da ich später immer unterschiedliche Namen vergeben wäre das so OK.
    Meine Frage wäre:
    Wenn ich den Index benutzen will, wie komme ich an den Index der Picturebox?
    Die obige Lösung kommt mir irgendwie ein bisschen "durch die Brust ins Auge" vor.
    Können die Objekte auch direkt angesprochen werden?

    stepper71 schrieb:

    Wenn ich den Index benutzen will

    VB.NET-Quellcode

    1. Dim img = FlowLayoutPanel1.Controls.Item(2)
    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!

    stepper71 schrieb:

    Was mich verwirrt: Ich kann mehrmals auf diesen code aufrufen und es werden immer mehr Picturebox Controls eingefügt, alle mit dem Bild.
    Warum komme ich dann keine Fehlermeldung? Die Controls heißen in diesem Beispiel doch alle gleich?
    Und wie würde ich dann die einzelnen Controls ansprechen wenn Sie alle gleich heißen?
    Vergiss die Name-Property einfach - die ist Schrott.
    Entferne auch tatsächlich die Zuweisung eines Strings an diese Property.

    Die Bezeichung "Name" ist ein WinForms-Fehldesign, denn es ist nicht der Name des Controls, sondern es ist eher eine Art Schlüsselwert vom typ STring, anhand dessen das Control auch identifiziert werden kann in der ControlCollection.

    Da aber nichtmal ein Fehler kommt, wenn 2 Controls derselbe "Name" zugewiesen wird, kann man diese Property einfach nur als Schrott und FehlDesign bezeichnen.
    Wir Rod schon sagt: Greif über den Index zu - der Index ist eindeutig.

    Tatsächlich hat ein Control zur Laufzeit einfach keinen Namen - Namen gibts nur zur Designzeit, im Code-Editor.

    Oder sieh es so: Die Variable newcontrol hat einen Namen: newcontrol. Und solange der eine Picbox zugewiesen ist, hat mw. diese Picbox den Namen newcontrol. Aber dann wird die Picbox ja der ControlCollection zugefügt, und die variable kriegt eine annere Picbox zugewiesen.

    Langer Rede kurzer Sinn: Vergiss die Name-Property der Controls.