Refresh Funktion für einen in ListView+LsitBox erstellten Ordner

  • VB.NET

Es gibt 30 Antworten in diesem Thema. Der letzte Beitrag () ist von paanaa.

    Refresh Funktion für einen in ListView+LsitBox erstellten Ordner

    Hallo zusammen,ich benötige für einen Ordner eine Refresh Funktion, die den Inhalt z.B. Images nach einer gewissen Zeit einfach aktualisiert
    (automatisch ohne einen Button).
    Ich habe bereits ein paar Sachen getestet, füge allerdings immer den alten Inhalt + neuen hinzu.

    Ich verwende WindowsForms VB.

    Ein weiterer Punkt wäre, die Images als eine Art Preview bzw. thumbnail im Ordner anzeigen zu lassen.

    Ich bin sehr dankbar für jede Hilfe!

    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. PictureBox1.Load(ListBox1.SelectedItem)
    36. End If
    37. End Sub
    38. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    39. If _dragActive = True AndAlso MouseButtons.HasFlag(MouseButtons.Left) Then
    40. Dim cp = Cursor.Position
    41. cp.Y += CInt(Cursor.Size.Height * 1.5)
    42. ttip.Show(_dragName, Me, PointToClient(cp))
    43. Else
    44. ttip.Hide(Me)
    45. _dragActive = False
    46. End If
    47. End Sub
    48. Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    49. End Sub
    50. End Class
    Hallo @paanaa,

    was meinst du mit refresh? windoof aktialisiert das doch immer, oder verstehe ich die Frage Falsch?

    Vielleicht mit einem Timer der alle x sekunden den Ordner neu abfrägt.

    VB.NET-Quellcode

    1. Dim Zaehler As Integer = 0
    2. Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    3. Zaehler = ImageList1.Images.Count - 1
    4. End Sub


    und halt im loadereignis Timer2.start()



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

    Es ist ja mein eigener Ordner, den ich erstellt habe und anzeigen lasse in der ListView, also nicht direkt von Windows.
    Mein Programm soll den Ordner aktuell halten, sodass immer alle Dateien sehen kann.

    EDIT: Vollzitat entfernt. ~fufu

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

    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!
    Danke!
    Ich habe es damit versucht zu lösen:

    VB.NET-Quellcode

    1. 'FileSystemWatcher
    2. Dim WithEvents m_fsw As IO.FileSystemWatcher
    3. Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Try
    5. FolderBrowserDialog1.ShowDialog()
    6. For Each item As String In My.Computer.FileSystem.GetFiles(FolderBrowserDialog1.SelectedPath, FileIO.SearchOption.SearchTopLevelOnly)
    7. ImageList1.Images.Add(Icon.ExtractAssociatedIcon(item))
    8. ListView1.Items.Add(My.Computer.FileSystem.GetName(item), ImageList1.Images.Count - 1)
    9. ListBox1.Items.Add(item)
    10. Next
    11. Catch ex As Exception
    12. End Try
    13. 'PictureBox EventHandler
    14. AddHandler PictureBox1.MouseUp, AddressOf _MouseUp
    15. 'FileSystemWatcher
    16. m_fsw = New IO.FileSystemWatcher("C:\Users\ano\Desktop\test image")
    17. m_fsw.EnableRaisingEvents = True
    18. m_fsw.IncludeSubdirectories = True
    19. m_fsw.Filter = "*jpg" And "*png"
    20. End Sub


    Allerdings sehe ich keine Aktualisierung in meinem Ordner, was mache ich falsch?

    EDIT: Vollzitat entfernt. ~fufu

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

    paanaa schrieb:

    was mache ich falsch?
    Du musst noch ein entsprechendes Event des FSW abonieren:

    VB.NET-Quellcode

    1. AddHandler m_fsw.Changed, AddressOf fswChanged

    Für verschiedene Extensionen musst Du mehrere FSW erstellen.
    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!

    Okay und was füge ich jetzt in die m_fswChanged sub ein als Anweisung, damit die Funktion das neue Image erfasst?

    VB.NET-Quellcode

    1. Private Sub fswChanged(source As Object, e As FileSystemEventArgs)
    2. End Sub


    Das hier habe ich ja in die Form1_Load ausgeführt

    VB.NET-Quellcode

    1. AddHandler m_fsw.Changed, AddressOf fswChanged


    EDIT: Vollzitat entfernt. ~fufu

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

    @paanaa Zunächst müsen wir erst mal sehen, was auf Deiner Platte passiert.
    Der FSW generiert mehrere Events, Created wäre noch eine Möglichkeit. Du kannst mehrere Events abonieren und allen dieselbe Prozedur zuweisen.
    Dann siehst Du Dir die EventArgs an, da hast e.FullPath und e.ChangeType, die wertest Du aus und reagierst entsprechend.
    Sieh Dir die Beispiele im MSDN-Link an.
    Fang an und gib ne MessageBox aus, wo beides drin steht.
    Ach ja:
    Mach Option Strict On.

    paanaa schrieb:

    VB.NET-Quellcode

    1. m_fsw.Filter = "*jpg" And "*png"
    ist Tinnef.
    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!

    paanaa schrieb:

    VB.NET-Quellcode

    1. m_fsw.Filter = "*jpg" And "*png"
    Schalte mal schleunigst auf Option Strict On um :!:
    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!
    @paanaa Das ist der Plan. :thumbup:
    Du musst jetzt selbst aufpassen, welche Datentypen verwendet werden, das bewirkt sekundär eine deutliche Verbesserung Deiner Software!
    Bei solch Meldungen hilft einfach ein .ToString().
    Rauskriegen musst Du das dann natürlich selbst, dafür musst Du nicht das Forum bemühen.
    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!
    @paanaa Hör bitte auf, die Posts über den Deinen vollständig zu zitieren, das mögen wir nicht.
    ====
    Wenn das Dein einziger Fehler war: Glückwunsch, bei anderen Kandidaten hageln da die Fehler zuhauf.
    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!
    Oh nein, bitte nicht. CType sollte man erwenden, wenn gar nichts anderes mehr geht. Zeig mal 2-3 Codezeilen, in denen Du CType nutzt und wir sagen Dir, wie man es anders (und wohl auch besser) machen kann.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VB.NET-Quellcode

    1. Private Sub ListView1_ItemDrag(sender As Object, e As ItemDragEventArgs) Handles ListView1.ItemDrag
    2. Dim lvItem As ListViewItem = DirectCast(e.Item, ListViewItem)
    3. _dragActive = True
    4. _dragName = CType(ListBox1.SelectedItem, String)
    5. Timer1.Start()
    6. End Sub


    Das hier habe ich so bei den 3 anderen Meldungen auch gehandhabt, da diese fast identisch sind.
    Hier reicht ein einfaches ListBox1.SelectedItem.ToString().
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Funktioniert, danke!

    Jetzt ist halt nur noch die Frage, wie ich statt der Konsolenausgabe des Pfades+Filename,
    eine richtige Refresh Funktion erstellen kann, sodass ich ein Image in den Ordner während ich das Programm ausführe, verschieben kann
    und es direkt sehe.

    paanaa schrieb:

    CType
    Hatten wir doch gerade:

    RodFromGermany schrieb:

    Bei solch Meldungen hilft einfach ein .ToString().
    ====
    Na statt der Consolenausgabe tust Du das, was getan werden muss.
    Da hattest Du doch schon was.
    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!