Probleme bei der Erstellung einer ListView, welche einen beliebigen Ordner mit Inhalt(Images) anzeigen soll mit VB Windows Forms

  • VB.NET

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Probleme bei der Erstellung einer ListView, welche einen beliebigen Ordner mit Inhalt(Images) anzeigen soll mit VB Windows Forms

    Guten Abend zusammen,

    im Rahmen eines Schulprojektes habe ich die Aufgabe eine VB Windows Forms Anwendung zu realisieren, welche die Funktion haben soll, eine ListView zu beinhalten und hierbei einen beliebigen Ordner, welcher sich auf der Festplatte befindet, darzustellen mit dem Inhalt (Images, .txt etc.).
    Nachdem dies geschehen ist, soll ein beliebiges Image, welches sich in dem Ordner befindet, per Drag and Drop Funktion in eine Picture Box gezogen werden können.

    Bei den anfänglichen Versuchen, stoße ich bei meinem Programm auf ein Error, bei dem die gesetzten Indicies falsch sind.
    Mein Programm wird interupted nachdem ich ein Bild erfolgreich geöffnet habe und ein zweites Bild öffnen möchte.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Try
    4. FolderBrowserDialog1.ShowDialog()
    5. For Each item As String In My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchTopLevelOnly)
    6. ImageList1.Images.Add(Drawing.Icon.ExtractAssociatedIcon(item))
    7. ListView1.Items.Add(My.Computer.FileSystem.GetName(item), ImageList1.Images.Count - 1)
    8. ListBox1.Items.Add(item)
    9. Next
    10. Catch ex As Exception
    11. End Try
    12. End Sub
    13. Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ListView1.SelectedIndexChanged
    14. Dim x As Integer
    15. ListBox1.SelectedIndex = ListView1.SelectedIndices(0)
    16. Dim selecteditem As String = ListBox1.SelectedItem
    17. Process.Start(selecteditem)
    18. End Sub
    19. End Class


    Die Fehlermeldung:

    Ich bin für jede Hilfe sehr dankbar!
    Bilder
    • Fehlermeldung.png

      130,2 kB, 1.725×921, 233 mal angesehen

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „paanaa“ ()

    Hi!

    Probier mal dieses:

    VB.NET-Quellcode

    1. Private Sub ListView1_ItemSelectionChanged(sender As Object, e As ListViewItemSelectionChangedEventArgs) Handles ListView1.ItemSelectionChanged
    2. Dim x As Integer = Nothing
    3. If e.IsSelected Then
    4. ListBox1.SelectedIndex = ListView1.SelectedIndices(0)
    5. Dim selecteditem As String = ListBox1.SelectedItem
    6. Process.Start(selecteditem)
    7. End If
    8. End Sub


    ​anstatt ...Handles ListView1.SelectedIndexChanged
    Hallo nochmal! ;)

    Weiss nich ob´s noch eine elegantere Lösung gibt..
    ..hier meine Lösung:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Try
    4. FolderBrowserDialog1.ShowDialog()
    5. For Each item As String In My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchTopLevelOnly)
    6. ImageList1.Images.Add(Icon.ExtractAssociatedIcon(item))
    7. ListView1.Items.Add(My.Computer.FileSystem.GetName(item), ImageList1.Images.Count - 1)
    8. ListBox1.Items.Add(item)
    9. Next
    10. Catch ex As Exception
    11. End Try
    12. 'PictureBox EventHandler
    13. AddHandler PictureBox1.MouseUp, AddressOf _MouseUp
    14. End Sub
    15. Private Sub ListView1_ItemSelectionChanged(sender As Object, e As ListViewItemSelectionChangedEventArgs) Handles ListView1.ItemSelectionChanged
    16. Dim x As Integer = Nothing
    17. If e.IsSelected Then
    18. ListBox1.SelectedIndex = ListView1.SelectedIndices(0)
    19. 'Dim selecteditem As String = ListBox1.SelectedItem
    20. 'Process.Start(selecteditem)
    21. End If
    22. End Sub
    23. Dim ttip As New ToolTip()
    24. Dim _dragActive As Boolean = False
    25. Dim _dragName As String = Nothing
    26. Private Sub ListView1_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView1.ItemDrag
    27. Dim lvItem As ListViewItem = DirectCast(e.Item, ListViewItem)
    28. _dragActive = True
    29. _dragName = ListBox1.SelectedItem
    30. Timer1.Start()
    31. End Sub
    32. Private Sub _MouseUp(ByVal sender As System.Object, ByVal e As MouseEventArgs)
    33. If e.Button = MouseButtons.Left AndAlso _dragActive Then
    34. Process.Start(ListBox1.SelectedItem)
    35. End If
    36. End Sub
    37. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    38. If _dragActive = True AndAlso MouseButtons.HasFlag(MouseButtons.Left) Then
    39. Dim cp = Cursor.Position
    40. cp.Y += CInt(Cursor.Size.Height * 1.5)
    41. ttip.Show(_dragName, Me, PointToClient(cp))
    42. Else
    43. ttip.Hide(Me)
    44. _dragActive = False
    45. End If
    46. End Sub
    47. End Class

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

    paanaa schrieb:

    Die Fehlermeldung
    Son Schmuddelserver, wo das Bild iwann nicht mehr verfügbar ist. ;(
    Das Forum verfügt über eine Datei-Anhangs-Funktion:
    Erweiterte Antwort => Dateianhänge => Hochladen.
    Editiere bitte Deinen 1. Post dementsprechend.
    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!
    Ich dachte, du willst hier was lernen. Statt dessen lässt du dir den ganzem Code (und vermutlich auch die Hausaufgaben/Projektaufgaben) fertig servieren. So wird das langfristig nix... Vor allem kommen da immer mehr Aufgaben zum Vorschein.

    Was soll den deine "Pain Funktion" alles können?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    Ich dachte, du willst hier was lernen. Statt dessen lässt du dir den ganzem Code (und vermutlich auch die Hausaufgaben/Projektaufgaben) fertig servieren. So wird das langfristig nix... Vor allem kommen da immer mehr Aufgaben zum Vorschein.

    Was soll den deine "Pain Funktion" alles können?


    Hey, du hast absolut recht mit deiner Anmerkung.

    Ich habe bereits ein Paint Programm geschrieben, welche die Funktionen hat ein Bild zu Laden, zu bearbeiten und zu speichern.
    Allerdings weiß ich nicht so recht, wie ich aus dem Ordner eine Datei direkt bearbeiten kann.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim pb, pw As Pen
    3. Dim bmp As Bitmap
    4. Dim x, y As Single
    5. Private Sub PictureBox1_Click(sender As Object, e As EventArgs)
    6. End Sub
    7. Private Sub ListView1_SelectedIndexChanged(sender As Object, e As EventArgs)
    8. End Sub
    9. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    10. OpenFileDialog1.ShowDialog()
    11. End Sub
    12. Private Sub SaveFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles SaveFileDialog1.FileOk
    13. bmp.Save(SaveFileDialog1.FileName)
    14. End Sub
    15. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    16. SaveFileDialog1.ShowDialog()
    17. End Sub
    18. Private Sub PictureBox1_Click_1(sender As Object, e As EventArgs) Handles PictureBox1.Click
    19. End Sub
    20. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    21. bmp = New Bitmap(1920, 1080)
    22. PictureBox1.BackColor = Color.White
    23. pb = New Pen(Color.Black, 2)
    24. pw = New Pen(Color.White, 100)
    25. End Sub
    26. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    27. x = e.X
    28. y = e.Y
    29. End Sub
    30. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    31. Dim g As Graphics = Graphics.FromImage(bmp)
    32. If e.Button = Windows.Forms.MouseButtons.Left Then
    33. g.DrawLine(pb, x, y, e.X, e.Y)
    34. PictureBox1.Image = bmp
    35. x = e.X
    36. y = e.Y
    37. End If
    38. If e.Button = MouseButtons.Right Then
    39. g.DrawLine(pw, x, y, e.X, e.Y)
    40. PictureBox1.Image = bmp
    41. x = e.X
    42. y = e.Y
    43. End If
    44. End Sub
    45. Private Sub OpenFileDialog1_FileOk(sender As Object, e As System.ComponentModel.CancelEventArgs) Handles OpenFileDialog1.FileOk
    46. Try
    47. Dim fs As New IO.FileStream(OpenFileDialog1.FileName, IO.FileMode.Open)
    48. bmp = New Bitmap(fs)
    49. fs.Close()
    50. PictureBox1.Image = bmp
    51. Catch ex As Exception
    52. End Try
    53. End Sub
    54. End Class
    Also wenn Du aus der ListBox heraus mit Doppelklick eine Datei zum editieren öffnen möchtest musst Du das "Doppelklick-Event" der ListBox nutzen um die gewählte Datei auszulesen!

    ​Dann kannst Du mit dem "Namen" der Datei eine "Bitmap" erstellen und diese zum "malen" nutzen!

    paanaa schrieb:

    Ich habe bereits ein Paint Programm geschrieben, welche die Funktionen hat ein Bild zu Laden, zu bearbeiten und zu speichern.
    Dieses Programm muss die ComandLine auslesen und falls da eine Datei übergeben wird, diese öffnen.

    VB.NET-Quellcode

    1. Dim args() = Environment.GetCommandLineArgs

    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!

    Morrison schrieb:

    Also wenn Du aus der ListBox heraus mit Doppelklick eine Datei zum editieren öffnen möchtest musst Du das "Doppelklick-Event" der ListBox nutzen um die gewählte Datei auszulesen!

    Dann kannst Du mit dem "Namen" der Datei eine "Bitmap" erstellen und diese zum "malen" nutzen!

    Wenn ich das "Doppelklick-Event" auswähle, habe ich nur die Wahl zwischen Form1_Load, Timer1_Tick und Pciturebox1_Click ?

    ich habe Probleme dabei, die beiden Programme irgendwie zusammen zu führen.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    3. Try
    4. FolderBrowserDialog1.ShowDialog()
    5. For Each item As String In My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchTopLevelOnly)
    6. ImageList1.Images.Add(Icon.ExtractAssociatedIcon(item))
    7. ListView1.Items.Add(My.Computer.FileSystem.GetName(item), ImageList1.Images.Count - 1)
    8. ListBox1.Items.Add(item)
    9. Next
    10. Catch ex As Exception
    11. End Try
    12. 'PictureBox EventHandler
    13. AddHandler PictureBox1.MouseUp, AddressOf _MouseUp
    14. 'Paint-------------------------------------------------------------------------------------------------------------------------------------------------
    15. bmp = New Bitmap(1920, 1080)
    16. PictureBox1.BackColor = Color.White
    17. pb = New Pen(Color.Black, 2)
    18. pw = New Pen(Color.White, 100)
    19. '------------------------------------------------------------------------------------------------------------------------------------------------------
    20. End Sub
    21. Private Sub ListView1_ItemSelectionChanged(sender As Object, e As ListViewItemSelectionChangedEventArgs) Handles ListView1.ItemSelectionChanged
    22. Dim x As Integer = Nothing
    23. If e.IsSelected Then
    24. ListBox1.SelectedIndex = ListView1.SelectedIndices(0)
    25. 'Dim selecteditem As String = ListBox1.SelectedItem
    26. 'Process.Start(selecteditem)
    27. End If
    28. End Sub
    29. Dim ttip As New ToolTip()
    30. Dim _dragActive As Boolean = False
    31. Dim _dragName As String = Nothing
    32. Private Sub ListView1_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView1.ItemDrag
    33. Dim lvItem As ListViewItem = DirectCast(e.Item, ListViewItem)
    34. _dragActive = True
    35. _dragName = ListBox1.SelectedItem
    36. Timer1.Start()
    37. End Sub
    38. Private Sub _MouseUp(ByVal sender As System.Object, ByVal e As MouseEventArgs)
    39. If e.Button = MouseButtons.Left AndAlso _dragActive Then
    40. 'Process.Start(ListBox1.SelectedItem)
    41. PictureBox1.Load(ListBox1.SelectedItem)
    42. End If
    43. End Sub
    44. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    45. If _dragActive = True AndAlso MouseButtons.HasFlag(MouseButtons.Left) Then
    46. Dim cp = Cursor.Position
    47. cp.Y += CInt(Cursor.Size.Height * 1.5)
    48. ttip.Show(_dragName, Me, PointToClient(cp))
    49. Else
    50. ttip.Hide(Me)
    51. _dragActive = False
    52. End If
    53. End Sub
    54. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click, ListBox1.DoubleClick
    55. End Sub
    56. ' Paint Funktion--------------------------------------------------------------------------------------------------------------------------------------------------------
    57. Dim pb, pw As Pen
    58. Dim bmp As Bitmap
    59. Dim x, y As Single
    60. Private Sub PictureBox1_MouseDown(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseDown
    61. x = e.X
    62. y = e.Y
    63. End Sub
    64. Private Sub PictureBox1_MouseMove(sender As Object, e As MouseEventArgs) Handles PictureBox1.MouseMove
    65. Dim g As Graphics = Graphics.FromImage(bmp)
    66. If e.Button = Windows.Forms.MouseButtons.Left Then
    67. g.DrawLine(pb, x, y, e.X, e.Y)
    68. PictureBox1.Image = bmp
    69. x = e.X
    70. y = e.Y
    71. End If
    72. If e.Button = MouseButtons.Right Then
    73. g.DrawLine(pw, x, y, e.X, e.Y)
    74. PictureBox1.Image = bmp
    75. x = e.X
    76. y = e.Y
    77. End If
    78. End Sub
    79. '----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    80. End Class


    Ich habe das jetzt so zusammengeführt, allerdings möchte ich ja per doppelklick die Datei bearbeiten können.
    Es soll ein neues Fenster geöffnet werden, indem ich das Bild editieren und speichern kann.


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

    Hallo!

    Was ist denn mit

    VB.NET-Quellcode

    1. Private Sub ListView1_MouseDoubleClick(sender As Object, e As MouseEventArgs) Handles ListView1.MouseDoubleClick
    2. Form2.PictureBox1.Load(ListBox1.SelectedItem)
    3. Form2.Show()
    4. End Sub

    ?

    Da drin kann man dann z.B. die zweite Form anzeigen lassen und da das Bild bearbeiten!
    Ich täte der Form2 eine öffentliche Image Variable geben. Dieser kann man beim instanziieren der Form2 einen Wert zuweisen. Danach dann die Form2 anzeigen und im Load Event der Form2 der PictureBox das Image zuweisen. Also ähnlich wie das, was @Morrison vorschlägt..
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @paanaa Was passiert, wenn Du den Dialog mit Esc abbrichst?
    Kommst Du durch das Form_Load durch?
    @Morrison Gugst Du Dialoge: Instanziierung von Forms und Aufruf von Dialogen
    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!

    RodFromGermany schrieb:

    @paanaa Was passiert, wenn Du den Dialog mit Esc abbrichst?
    Kommst Du durch das Form_Load durch?
    @Morrison Gugst Du Dialoge: Instanziierung von Forms und Aufruf von Dialogen


    Meinst du mit soetwas z.B.?

    VB.NET-Quellcode

    1. Private Sub Form1_KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs) Handles MyBase.KeyDown
    2. If e.KeyCode = Keys.Escape Then Me.Close()
    3. End Sub


    hierbei passiert nämlich nichts.

    Ich kann jetzt das Bild öffnen mit einem doppelklick, allerdings verschwindet das Bild, wenn ich es bearbeiten will, da ich in Form 2
    diese Funktion hier habe:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. bmp = New Bitmap(1920, 1080)
    3. PictureBox1.BackColor = Color.White
    4. pb = New Pen(Color.Black, 2)
    5. pw = New Pen(Color.White, 100)
    6. End Sub


    Wie kann ich das ausgewählte Image nun als Bitmap "umwandeln", damit ich das Bild bearbeiten kann?

    Hat sich mit der Zeile

    VB.NET-Quellcode

    1. bmp = PictureBox1.Image
    erledigt

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

    paanaa schrieb:

    hierbei passiert nämlich nichts.
    Das klappt nur, wenn die Form auf KeyPreview = True steht.
    ====
    Ich meine, dass Du in Deiner FoemLoad ein Exceptionhandling hast.
    Überzeuge Dich, dass der Code tatsächlich abgearbeitet wird, denn gewisse Exceptions werden vom Framework abgefangen und damit die FormLoad einfach abgebrochen.
    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!