Listview Problem

  • VB.NET

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

    Listview Problem

    Hallo zusammen

    Ich brauche Hilfe, bei einem Projekt das ich zuvor schon einmal programmeirt habe, jedoch irgendwie abhanden gekommen ist.
    Ich ziehe per Drag'n'Drop Dateien auf meine Listview, der Code dazu sieht so aus:

    VB.NET-Quellcode

    1. Private Sub lv_main_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lv_main.DragEnter
    2. If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
    3. 'Kopiereffekt
    4. e.Effect = DragDropEffects.Copy
    5. End If
    6. End Sub
    7. Private Sub lv_main_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lv_main.DragDrop
    8. 'Auslesen
    9. Dim data() As String = e.Data.GetData(DataFormats.FileDrop)
    10. For Each Datei As String In data
    11. Dim DI As New IO.FileInfo(Datei)
    12. If Not IsAlreadyInListview(Datei) Then
    13. AddListeviewMain(DI.Name, DI.Length, DI.DirectoryName)
    14. Else
    15. M("Information", "Die Datei """ & DI.Name & """ ist bereits vorhanden.", MessageBoxButtons.OK, MessageBoxIcon.Information)
    16. End If
    17. Next
    18. End Sub

    Da ich keine gleichen Dateien will, hab ich mir eine Funktion (IsAlreadyInListview) gebastelt, dir mir zurückgibt (true/false), ob die Datei bereits in der Listview aufgelistet ist:

    VB.NET-Quellcode

    1. Private Function IsAlreadyInListview(ByVal Filepath As String) As Boolean
    2. Dim DI As New IO.FileInfo(Filepath)
    3. If lv_main.Items.Count > 0 Then
    4. For Each Datei As String In lv_main.Items
    5. If Datei = DI.Name Then
    6. Return True
    7. Exit Function
    8. End If
    9. Next
    10. End If
    11. Return False
    12. End Function 'Bereits in ListBox vorhanden

    Falls nicht, wird sie mit der Sub "AddListviewMain" aufgelistet:

    VB.NET-Quellcode

    1. Private Sub AddListeviewMain(ByVal Name As String, ByVal Size As Long, ByVal Pfad As String)
    2. With lv_main.Items.Add(Name).SubItems
    3. .Add(Size.ToString)
    4. .Add(Pfad)
    5. End With
    6. End Sub 'Datei zu Listview hinzufügen

    Das funktioniert perfekt, allerdings nur bei der ersten Datei die ich auf meine Listview ziehe.
    Sobald ich eine zweite Datei darauf ziehe, wird diese nicht aufgelistet. Ziehe ich eine gleiche Datei darauf wird auch keine Fehlermeldung ausgegeben.

    Einzelschritt hat nichts gebracht, sobald er bei "IsAlreadyInListview" bei "For Each Datei As String In lv_main.Items" ankommt, und auf F8 drücke, fällt er aus dem Einzelschritt raus und zeigt die Form an, auf der die zweite Datei nicht zu sehen ist. Also als hätte ich statt F5 anstatt F8 gedrückt.. (Ich habe F8 gedrückt, hab's schon 10x versucht).

    Wo liggt das Problem, hab ich was vergessen?

    Würde mich über Hilfe freuen.

    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    Probier mal:


    VB.NET-Quellcode

    1. If IsAlreadyInListview(Datei) = false Then
    2. AddListeviewMain(DI.Name, DI.Length, DI.DirectoryName)
    3. Else
    4. M("Information", "Die Datei """ & DI.Name & """ ist bereits vorhanden.", MessageBoxButtons.OK, MessageBoxIcon.Information)
    5. End If




    Grüße
    Ok, ich hab mich nochmal dran gesetzt:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub AddListeviewMain(ByVal Name As String, ByVal Size As Long, ByVal Pfad As String)
    3. With lv_main.Items.Add(Name).SubItems
    4. .Add(Size.ToString)
    5. .Add(Pfad)
    6. End With
    7. End Sub
    8. Private Function IsAlreadyInListview(ByVal Filepath As String) As Boolean
    9. Dim DI As New IO.FileInfo(Filepath)
    10. If lv_main.Items.Count > 0 Then
    11. For i = 0 To lv_main.Items.Count - 1
    12. If lv_main.Items(i).Text = DI.Name.ToString Then
    13. Return True
    14. Exit Function
    15. End If
    16. Next
    17. End If
    18. Return False
    19. End Function
    20. Private Sub lv_main_DragEnter(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lv_main.DragEnter
    21. If (e.Data.GetDataPresent(DataFormats.FileDrop)) Then
    22. 'Kopiereffekt
    23. e.Effect = DragDropEffects.Copy
    24. End If
    25. End Sub
    26. Private Sub lv_main_DragDrop(ByVal sender As Object, ByVal e As System.Windows.Forms.DragEventArgs) Handles lv_main.DragDrop
    27. 'Auslesen
    28. Dim data() As String = CType(e.Data.GetData(DataFormats.FileDrop), String())
    29. For Each Datei As String In data
    30. Dim DI As New IO.FileInfo(Datei)
    31. If Not IsAlreadyInListview(Datei) Then
    32. AddListeviewMain(DI.Name, DI.Length, DI.DirectoryName)
    33. Else
    34. MessageBox.Show("Information", "Die Datei """ & DI.Name & """ ist bereits vorhanden.", MessageBoxButtons.OK, MessageBoxIcon.Information)
    35. End If
    36. Next
    37. End Sub
    38. End Class


    Deine Funktion wo du die Liste durchgehst war irgendwie ein bischen ... verrückt.
    (Ungültige Konvertierung von Typ ListViewItem in Typ String.)

    OPTION STRICT ON

    Grüße

    ThuCommix schrieb:

    OPTION STRICT ON

    Ich programmiere immer mit Option Strict On, leider habe ich Montags die Abteilung gewechselt (= neuer Computer) und Option Strict On nicht gleich als Standard gesetzt, als ich es neu installiert habe.

    Jedoch erhielt ich diese Meldung nicht: "(Ungültige Konvertierung von Typ ListViewItem in Typ String.)"
    Auch nicht mit Option Strict On :S (Eigentlich unmöglich..)

    Naja, Projekt läuft. UND Option Strict On ist wieder Standardmässig eingeschalten ;DDD

    Danke dir.

    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...
    ja, das ist ein Problem bei DragnDrop, das hat MS richtig vermurkst. Da werden Exceptions einfach verschluckt, und man sucht sich dumm und dämlich.
    Abhilfe schafft Draggen in der Anwendung (leider nur c#, aber die erläuterungen gelten türlich auch in vb.)
    Ah - habich sogar nach vb gemacht: DragnDrop innerhalb der Anwendung

    ErfinderDesRades schrieb:

    ja, das ist ein Problem bei DragnDrop, das hat MS richtig vermurkst. Da werden Exceptions einfach verschluckt, und man sucht sich dumm und dämlich.

    Richtig.

    ErfinderDesRades schrieb:

    Abhilfe schafft Draggen in der Anwendung (leider nur c#, aber die erläuterungen gelten türlich auch in vb.)
    Ah - habich sogar nach vb gemacht: DragnDrop innerhalb der Anwendung

    Danke für die Links, schau ich mir an.

    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...