Listview Items/Subitems von mehreren markierten Columns rauskopieren

  • VB.NET
  • .NET 4.5

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von IronStorm.

    Listview Items/Subitems von mehreren markierten Columns rauskopieren

    Hallo gibt es eine Möglichkeit wenn ich eine Listview habe mit 5 Zeilen und 3 spalten mir 3 Zeilen zu markieren und dann mit der rechten maustaste in die Beschreibung einer spalte zu klicken und dann die subitems der markierten zeilen in die Zwischenablage kopiert zu bekommen?
    Aktuell habe ich es nur hinbekommen, dass ich eine oder mehrere ganze Zeilen kopiert bekomme.
    Wenn es unbedingt ein LV sein muss und kein schön hergerichtetes DGV sein darf, hier mal ein Beispiel mit nem LV namens ListView1:

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub ListView1_MouseClick(sender As Object, e As MouseEventArgs) Handles ListView1.MouseClick
    2. If e.Button = MouseButtons.Right Then
    3. Clipboard.Clear()
    4. Dim SelectedCol = GetLVColumnIndexAtPos(ListView1, e.X)
    5. If SelectedCol > -1 Then
    6. Clipboard.SetText(GetSubItemDataForAllSelectedListViewRowsInColumn(ListView1, SelectedCol))
    7. End If
    8. End If
    9. End Sub
    10. Private Function GetLVColumnIndexAtPos(LV As ListView, MouseX As Integer) As Integer
    11. If LV.View <> View.Details Then Return -1
    12. Dim ColX = 0
    13. For i = 0 To ListView1.Columns.Count - 1
    14. ColX = 0
    15. For j = 0 To i - 1
    16. ColX += ListView1.Columns(j).Width
    17. Next
    18. If MouseX >= ColX AndAlso MouseX <= ColX + ListView1.Columns(i).Width Then Return i
    19. Next
    20. Return -1
    21. End Function
    22. Private Function GetSubItemDataForAllSelectedListViewRowsInColumn(LV As ListView, SelectedCol As Integer) As String
    23. Dim CollectedData = ""
    24. For Each Row As ListViewItem In ListView1.SelectedItems
    25. CollectedData &= Row.SubItems(SelectedCol).Text & Environment.NewLine
    26. Next
    27. Return CollectedData
    28. End Function

    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    ― Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Das kopiert mir aber die komplette Spalte oder?
    Ich hätte gerne einzelne Zeilen markiert und das davon die Spalteneinträge kopiert werden von der Spalte wo ich rechts klicke

    Mit DGV hab ich noch nicht gearbeitet :/

    Edit: Funktioniert doch. hab nur nicht gecheckt, dass ich auf die Subitems klicken muss und nicht auf die Überschriften der Columns.
    Geht das auch?

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

    Na das geht sehr einfach, da es für das Anklicken des Spaltenkopfes ein eigenes Event gibt, welches auch noch den Spaltenindex mitliefert:

    VB.NET-Quellcode

    1. Private Sub ListView1_ColumnClick(sender As Object, e As ColumnClickEventArgs) Handles ListView1.ColumnClick
    2. If ListView1.View <> View.Details Then Exit Sub
    3. Clipboard.Clear()
    4. Dim CollectedData = ""
    5. For Each Row As ListViewItem In ListView1.SelectedItems
    6. CollectedData &= Row.SubItems(e.Column).Text & Environment.NewLine
    7. Next
    8. If Not String.IsNullOrEmpty(CollectedData) Then Clipboard.SetText(CollectedData)
    9. End Sub


    DGV bietet eine Vielzahl an Möglichkeiten mehr und ist von Haus auch an eine Datenquelle bindbar, Stichwort DataSet. Da liefert ErfinderDesRades einiges an guten Tutorials.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von VaporiZed, mal wieder aus Grammatikgründen.

    ― häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    ― Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    @IronStorm Nimm Dein Problem als Anlass, dem Ranz ListView den Rücken zu kehren und Dich dem DataGridView zuzuwenden.
    Die helfen wollenden Leute hier im Forum geben Dir ihre ober-aller-vollste Unterstützung.
    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).
    VB-Fragen über PN / Konversation werden ignoriert!

    VaporiZed schrieb:

    Na das geht sehr einfach, da es für das Anklicken des Spaltenkopfes ein eigenes Event gibt, welches auch noch den Spaltenindex mitliefert:

    VB.NET-Quellcode

    1. Private Sub ListView1_ColumnClick(sender As Object, e As ColumnClickEventArgs) Handles ListView1.ColumnClick
    2. If ListView1.View <> View.Details Then Exit Sub
    3. Clipboard.Clear()
    4. Dim CollectedData = ""
    5. For Each Row As ListViewItem In ListView1.SelectedItems
    6. CollectedData &= Row.SubItems(e.Column).Text & Environment.NewLine
    7. Next
    8. If Not String.IsNullOrEmpty(CollectedData) Then Clipboard.SetText(CollectedData)
    9. End Sub


    DGV bietet eine Vielzahl an Möglichkeiten mehr und ist von Haus auch an eine Datenquelle bindbar, Stichwort DataSet. Da liefert ErfinderDesRades einiges an guten Tutorials.


    Danke habe es mir noch bisschen umgebaut das er wenn nix markiert ist jedes subitem ausgibt ;)

    Die Tutorials sind mega Klassen und super erklärt.
    Vlt werde ich in absehbarer Zeit meine Listview umbauen :)

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