Listview - item.tag problem

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Listview - item.tag problem

    hallo erst mal,
    ich hab ein problem in meinen projekt was ich einfach nicht im griff bekomme und eure hilfe dazu benötige.
    kurze erklärung: in meinen projekt wähle ich per OpenFileDialog einen ordner aus der gescannt wird und alle dateien aus unterordner und ordner werden in die listview geschrieben.
    das mach ich mit der "rekursiv" variante, wo ich auch den listview - item.tag vergebe. der item.tag ist denn der ordner name wo die jeweilige datei sich drin befindet. jetzt zu dem eigentlichen problem was ich habe, per funktion kann ich den ordner umbenennen von dem im listview selektierten item (datei), was auch funktioniert, nur in den meisten fallen ist ja nicht nur eine datei im ordner sondern mehrere und hier kommt auch der fehler immer. wenn ich eine anderes item (datei) wähle (also im listview selektiere), die sich auch in von mir vorher um genannten ordner befindet, kriege ich immer den fehleranzeige "datei nicht gefunden". das problem liegt am item.tag(ordner name), beim ordner umbenennen sage ich auch per schleife das item.tag = newitem.tag ist, doch er macht es einfach nicht. nur das selektierte item hat den neuen .tag übernommen, die anderen items haben danach immer noch den alten .tag.
    hier mal mein rename code, vieleicht nicht besonders sauber beschrieben aber ich bin nach am vb lernen


    VB.NET-Quellcode

    1. For Each item As ListViewItem In ListView1.SelectedItems
    2. If item.Tag IsNot Nothing Then
    3. 'pfad zusammen stellen
    4. Dim los = (TreeView1.TopNode).Text
    5. Dim lus = (item.Tag).ToString
    6. Dim les = (ListView1.FocusedItem).Text
    7. Dim las = IO.Path.Combine(los, lus, les)
    8. 'info aus mp3tag lesen
    9. Mp3Info.Read(las)
    10. ar = Mp3Info.ID3v23Tag.Artist ' interpret
    11. al = Mp3Info.ID3v23Tag.Album' album
    12. ja = Mp3Info.ID3v23Tag.Year ' jahr
    13. ge = Mp3Info.ID3v23Tag.Genre' genre
    14. 'alten pfad merken
    15. Dim newlas = IO.Path.Combine(los, lus)
    16. If cbo_rename.SelectedItem = "%ar" Then
    17. newItem = ar
    18. ElseIf cbo_rename.SelectedItem = "%ar - %al" Then
    19. newItem = ar & " - " & al
    20. ElseIf cbo_rename.SelectedItem = "%ar - %al - %ja" Then
    21. newItem = ar & " - " & ti & " - " & ja
    22. End If
    23. 'neuen pfad zusammen setzen
    24. newlas = los + "\" + newItem
    25. If Directory.Exists(newlas) And Not Directory.Exists(newlas) Then
    26. 'umbenennen vom ordner
    27. My.Computer.FileSystem.RenameDirectory(newlas, newItem)
    28. Dim directory As DirectoryInfo
    29. directory = New IO.DirectoryInfo(newlas)
    30. Dim files = directory.GetFiles()
    31. For Each file As FileInfo In files
    32. Dim colCount = ListView1.Columns.Count
    33. Dim listCount = ListView1.Items.Count - 1
    34. For j As Integer = 0 To listCount
    35. Dim lvName = ListView1.Items(j).Text
    36. If lvName = file.Name Then
    37. For i As Integer = 0 To colCount
    38. Dim colName = ListView1.Columns(i).Text
    39. 'columnsheader name
    40. If colName = "Ordner" Then
    41. 'neuer .tag
    42. item.Tag = file.Directory.Name
    43. 'neuer eintrag in listview
    44. ListView1.Items(j).SubItems(i).Text = newItem
    45. Exit For
    46. End If
    47. Next
    48. End If
    49. Next
    50. Next
    51. End If
    52. End If
    53. Next
    54. End Sub


    habt ihr ein tip, rat für mich
    falls noch infos gebraucht werder, einfach fragen

    ich sag denn schon mal thx thx

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

    auch wenns doov klingt mach dir ein labelxxxxx (nummer bekommste ja automatisch) und dann übergebe mal item.tag an labelxxxxx und schaue ob der ordner/pfad wirklich korrekt geschrieben ist. unter der bedingung das wirklich "item.tag" den falschen wert liefert sonst > fehlermeldung posten bzw
    den debugger mit haltepunkt versehen an einer stelle bevor es knallt und schauen was passiert und welche variablen was haben/bekommen

    ich habe mich wegen einem leerzeichen schon mal doov gesucht
    moin, alles schon gemacht und versucht.
    und das ist es ja, die pfade stimmen nicht überein,weil die anderen dateien im gleichen ordner nicht den neuen .tag übernehmen. der fehler besagt ja, das er die neu selektierte datei nicht finden kann, weil der item.tag immernoch den zuvor alten orner name hat und nicht den neu vergebenen. er übernimmt nur den neuen item.tag beim selektierten datei und die anderen halt nicht.

    gruß und thx
    leere mal bitte "item.tag" vor dem befüllen und direkt nach dem leeren ne msg box und direkt nach dem füllen eine 2.
    dann siehste direkt ob an den 2 stellen alles klappt

    was mir aufgefallen ist : was macht
    Dim = (item.Tag).ToString

    sollte dein code nicht so sein ?

    VB.NET-Quellcode

    1. If colName = "Ordner" Then
    2. 'neuer .tag
    3. 'item.Tag = file.Directory.Name
    4. item.Tag = newlas
    5. 'neuer eintrag in listview
    6. ListView1.Items(j).SubItems(i).Text = newItem
    7. Exit For
    8. End If


    edit siehe bild:

    du erstellst in zeile 26 den pfad
    prüfst in 28 auf den pfad aus zeile26
    und gehst aber in zeile47 her und speicherst file.directory.name

    solltest du da nicht den "newlas" nehmen weil du immer noch in dem ordner bist auf dessen
    existenz du in zeile28 getestet hast ?
    Bilder
    • 59354-listview-item-tag.png

      48,24 kB, 876×774, 216 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Triple-Axe“ ()

    meld mich mal zurück :)

    also
    Dim lus = (item.Tag).ToString >> ist der gespeicherter ordner name

    vergeben tue ich den in

    VB.NET-Quellcode

    1. Private Sub Rekursiv(ByVal oDirs As IO.DirectoryInfo)
    2. Dim oSubDir As IO.DirectoryInfo
    3. Dim oFile As IO.FileInfo
    4. Try
    5. ' zunächst alle Dateien des Ordners aufspüren
    6. For Each oFile In oDirs.GetFiles("*.mp3")
    7. Mp3Info.Read(oFile.FullName)
    8. With oFile
    9. Dim item = ListView1.Items.Add(.Name)
    10. item.SubItems.Add(Mp3Info.ID3v23Tag.Artist) ' Interpret
    11. item.SubItems.Add(Mp3Info.TrackNum.ToString) ' track
    12. item.SubItems.Add(Mp3Info.ID3v23Tag.TrackCount.ToString) ' track
    13. item.SubItems.Add(Mp3Info.ID3v23Tag.Album) ' album
    14. item.SubItems.Add(Mp3Info.ID3v23Tag.Genre) ' genre
    15. item.SubItems.Add(Mp3Info.ID3v23Tag.Title) ' titel
    16. item.SubItems.Add(Mp3Info.Duration.ToString) ' dauer
    17. item.SubItems.Add(oFile.LastAccessTime.ToString)
    18. If oFile.Extension = ".mp3" Or oFile.Extension = ".MP3" Then
    19. item.ImageKey = "MP3"
    20. Else
    21. item.ImageKey = "file"
    22. End If
    23. item.Tag = oDirs '<< hier bekommt jede datei ihren .tag verpasst, in meimen falle merkt er sich den ordner name
    24. End With
    25. Next
    26. ' Jetzt alle Unterverzeichnis durchlaufen
    27. ' und die Prozedur rekursiv selbst aufrufen
    28. For Each oSubDir In oDirs.GetDirectories()
    29. Rekursiv(oSubDir)
    30. Next
    31. Catch ex As Exception
    32. End Try
    33. ListView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize)
    34. End Sub


    + zu dem pic, in zeile 28 hat sich da ein schreibfehler reingeschlichen, es wird da nur überprüft ob der pfad existiert oder nicht,wenn nicht leg an
    + du hast geschrieben item.tag = newlas, das wird nicht funktioniert, denn item.tag ist im string nur der ordner name und newlas ist ein kompletter pfad zu datei
    + file.directory.name stellt den neuen ordner name dar

    ich hab keine ideen mehr, zum verrückt werden ?( ?( ?( :wacko:

    falls ich es nocht nicht geasgt habe, thx für deine unterstützung :thumbsup:
    gruß
    Hallo,
    ich finde, du versuchst hier alle möglichen Funktionen in die Listview zu quetschen. Folgender Vorschlag:
    Listview füllen mit ausschließlich den benötigten Infos für die Anzeige.
    Im Item Tag den Fullname der Fileinfo speichern.
    Zum Verschieben und Umbenennen der Datei die Funktion der Fileinfo- bzw. Directoryinfo-Klasse verwenden (z.B. MovoTo)
    Listview.Items löschen
    Listview neu füllen.

    Entsprechend eines solchen Arbeitsplanes solltest du auch die Funktionen strukturieren und benennen.

    Fiel Fergnügen
    Vatter
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    hi vatter.
    die variante die du da vorschlägst hatte ich ganz zum anfang drin. fand ich aber nicht so toll, weil es zu langwierig ist. zum beispiel hab ich ein ordnerstamm mit ca. 800 ordner,unterordner wo ca. 6000 files drin sind :D die denn im listview dargestellt werden, jetzt möchte ich aber nur einen ordner oder datei umbenennen und danach werden die ganzen 6000 dateien gelöscht und neu eingelesen :cursing: , ich glaube auf dauer macht das keinen sinn ;( . deswegen hab ich im nachhienein diese variante verworfen.

    und soviele funktionen hab ich garnicht

    ordner auswählen >> ordner/unterordner scannen >> dateien werden ins liestview übergeben >> und denn nur noch die rename funktion >> das wars

    gruß

    aSc0I3y schrieb:

    denn nur noch die rename funktion >> das wars

    Dann mußt du nur noch dafür sorgen, dass beim Umbenennen bzw. Verschieben eines Ordners alle darauf bezogenen Items entsprechend aktualisierst. Das läuft darauf hinaus, dass alle Items durchlaufen werden müssen. das kommt aufs selbe raus. Außerdem werden auch nicht "die ganzen 6000 Dateien gelöscht", sondern lediglich die Items, die Strings mit den Pfaden bzw. Infos deiner mp3 enthalten.
    Das Durchlaufen deiner Dirctory mit Getfiles oder GetFileInfo geht eigentlich recht schnell und hält den Code übersichtlich (Also meine Meinung).
    :thumbsup: Seit 26.Mai 2012 Oppa! :thumbsup:
    funktioniert, ordner umbenennen > listview.item remove > file neu einlesen > neuer eintrag in listview ^^ fertig

    jetzt hab ich nur noch ein kleines problemchen und zwar werder die neu hin zugefügten einträge hinten dran gesetzt. wie mach ich das jetzt das die neuen einträgen an der stelle wieder sind wo die alten waren.
    kann mir da weiter helfen.
    thx ung gruß
    wenn ich mich nich ganz irre ( bin grad am meine server neu installiern sry ) dann geht das nicht direkt sondern du musst das anders machen

    bsp:

    du hast 4 einträge

    0 a
    1 b
    2 c
    3 d

    die kannst du ja einfach bearbeiten und c löschen
    wenn ich mich nich ganz irre sieht deine listview nun so aus

    0 a
    1 b
    2 d

    d.h. wenn du 2 zu c und 3 zu d machen willst lösche das letzte raus

    0 a
    1 b

    und speichere es zwischen ( array ? ) > d

    0 a
    1 b
    2 c
    3 d
    dann trage deinen wert ein und dann die "alten" neune darunter