Listview - Wie bekomme ich die ausgewählten Daten?

  • VB.NET

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

    Listview - Wie bekomme ich die ausgewählten Daten?

    Mein Code erstellt eine Tabelle mit 20 Einträgen, bestehend aus ID, Username, Passwort.

    Wenn ich nun im Listview eine Zeile anklicke, würde ich dann auch gerne die Einträge, die sich in dieser Zeile befinden auslesen, aber WIE, ich kapiere es einfach nicht. :cursing:

    Mit den Beispielen, die ich beim googeln gefunden habe komme ich dabei keinen Schritt weiter. (Listboxen sind da deutlich einfacher, aber damit kann ich ja offenbar sowas nicht machen.)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rn As New Random
    3. Dim ID As Integer
    4. Dim Username As String
    5. Dim Passwort As String
    6. Dim Zeichentabelle As String
    7. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    8. ListView1.Clear()
    9. ListView1.View = View.Details
    10. ListView1.Columns.Add("ID", 50, HorizontalAlignment.Left)
    11. ListView1.Columns.Add("Username", 150, HorizontalAlignment.Left)
    12. ListView1.Columns.Add("Passwort", 150, HorizontalAlignment.Left)
    13. ID = 1
    14. Zeichentabelle = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890+-!§$%&()=?*.,;:"
    15. 'Daten in Listview füllen
    16. For i1 As Integer = 0 To 19
    17. Username = ""
    18. Passwort = ""
    19. For i2 As Integer = 0 To 9 'Usernamen und Passworte aus zufälligen Zeichen der Zeichentabelle erstellen
    20. Username &= Zeichentabelle.Substring(rn.Next(0, Zeichentabelle.Length), 1)
    21. Passwort &= Zeichentabelle.Substring(rn.Next(0, Zeichentabelle.Length), 1)
    22. Next
    23. '
    24. MyListText(0) = CStr(ID)
    25. MyListText(1) = Username
    26. MyListText(2) = Passwort
    27. ID += 1
    28. MyListItem = New ListViewItem(MyListText)
    29. ListView1.Items.Add(MyListItem)
    30. Next
    31. End Sub
    32. Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
    33. '????
    34. End Sub
    35. End Class


    Ups, das gehört auch noch dazu:

    VB.NET-Quellcode

    1. Module Module1
    2. Public MyListText(10) As String
    3. Public MyListItem As ListViewItem
    4. End Module

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

    du meinst wenn du jetzt dann auf einen Eintrag im Listview clickst oder?

    Private Sub listview1_read(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles listview1.MouseClick

    Try
    msgbox(listview1.SelectedItems(0).Text)
    Catch ex As Exception
    End Try
    End Sub
    Sowas in der Art hatte ich auch schon erreicht, aber zum Einen wird nur auf einen Klick in der Spalte ID reagiert, zum Anderen auch nur der Inhalt dieses Feldes ausgegeben, die danebenstehenden Felder, worin Username und Passwort stehen bräuchte ich auch.
    Ist doch gar nicht so kompliziert:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. ListView1.Clear()
    4. ListView1.View = View.Details
    5. ListView1.Columns.Add("ID", 50, HorizontalAlignment.Left)
    6. ListView1.Columns.Add("Username", 150, HorizontalAlignment.Left)
    7. ListView1.Columns.Add("Passwort", 150, HorizontalAlignment.Left)
    8. End Sub
    9. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    10. Dim item As ListViewItem = ListView1.Items.Add("ztzt")
    11. item.SubItems.Add("jhjhjhj")
    12. item.SubItems.Add("kjkjkj")
    13. End Sub
    14. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    15. For Each item As ListViewItem In ListView1.Items
    16. item.Text = "ID"
    17. item.SubItems(1).Text = "Username"
    18. item.SubItems(2).Text = "Passwort"
    19. Next
    20. End Sub
    21. End Class
    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!
    wenn du dann den index änderst bzw alle abfragst? sollte doch klappen oder?
    zb.

    SelectedItems(0)

    SelectedItems(1)

    SelectedItems(2)


    edit: oh hab den post über mir gar ned gesehn ;)

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

    @RodFromGermany
    Wie dein Codebeispiel nun mein Problem löst erkenne ich leider nicht. Hab da offenbar irgendwie ne Blockade.. Oder ich sollte mal Pennen gehen, bevor ich es weiterversuche.

    @LordPhil
    SelectedItems(1) usw mag es garnicht.
    InvalidArgument=Value mit dem Wert 1 ist für index ungültig.



    Habe aber einen Beitrag entdeckt, der mir eventuell weiterhelfen könnte, muss aber auch erst einmal dahinterkommen, wie das als Code dann aussehen müsste: [VB 2008] ListView-Feld auslesen

    VB.NET-Quellcode

    1. For Each item As ListViewItem In ListView1.Items
    2. item.Text = "ID"
    3. item.SubItems(1).Text = "Username"
    4. item.SubItems(2).Text = "Passwort"
    5. Next

    kann man auch lesen als

    VB.NET-Quellcode

    1. Dim ID As String = item.Text
    2. Dim Username As String = item.SubItems(1).Text
    3. Dim Passwort As String = item.SubItems(2).Text
    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!
    Gut, das bringt mich einen Schritt weiter.
    Ich verwende im Moment folgenden Code, um die Einträge an 3 Listboxen zu übergeben, weil ich bisher nicht dahintersteige, wie ich nur die ID, Username, Passwort der angeklickten Zeile bekommen kann (Bei Listboxen kann ich zumindest mit dem Index arbeiten, könnte dann also den Inhalt der Spalte ID benutzen.). -.-

    VB.NET-Quellcode

    1. Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
    2. Try
    3. For Each item As ListViewItem In ListView1.Items
    4. ListBox1.Items.Add(item.Text)
    5. ListBox2.Items.Add(item.SubItems(1).Text)
    6. ListBox3.Items.Add(item.SubItems(2).Text)
    7. Next
    8. MessageBox.Show(ListBox2.Items.Item(CInt(ListView1.SelectedItems(0).Text) - 1))
    9. Catch ex As Exception
    10. TextBox1.Text = ex.ToString
    11. End Try
    12. End Sub


    Ich habe das ganze in einen Try Catch Block gesetzt, da ich permanent eine Exception bekomme, wenn ich zum zweiten mal in die Listview klicke, um eine andere Zeile anzeigen zu lassen (im Test nur den Eintrag in der Spalte Username). Hier die Fehlermeldung:

    System.ArgumentOutOfRangeException: InvalidArgument=Value mit dem Wert 0 ist für index ungültig.
    Parametername: index
    bei System.Windows.Forms.ListView.SelectedListViewItemCollection.get_Item(Int32 index)
    bei WindowsApplication1.Form1.ListView1_SelectedIndexChanged(Object sender, EventArgs e) in I:\VB Arbeitsumgebung\Listview_0\Listview_0\Form1.vb:Zeile 54.


    Wieso erhalte ich die Exception, was ändert sich denn beim zweiten Klick?

    Hier nochmal mein vollständiger Code: (Form enthält Listview1, ListBox1, ListBox2, ListBox3)

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim rn As New Random
    3. Dim ID As Integer
    4. Dim Username As String
    5. Dim Passwort As String
    6. Dim Zeichentabelle As String
    7. Dim MyListText(10) As String
    8. Dim MyListItem As ListViewItem
    9. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    10. ListView1.Clear()
    11. ListView1.View = View.Details
    12. ListView1.Columns.Add("ID", 50, HorizontalAlignment.Left)
    13. ListView1.Columns.Add("Username", 150, HorizontalAlignment.Left)
    14. ListView1.Columns.Add("Passwort", 150, HorizontalAlignment.Left)
    15. ID = 1
    16. Zeichentabelle = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890+-!§$%&()=?*.,;:"
    17. 'Daten in Listview füllen
    18. For i1 As Integer = 0 To 19
    19. Username = ""
    20. Passwort = ""
    21. For i2 As Integer = 0 To 9 'Usernamen und Passworte aus zufälligen Zeichen der Zeichentabelle erstellen
    22. Username &= Zeichentabelle.Substring(rn.Next(0, Zeichentabelle.Length), 1)
    23. Passwort &= Zeichentabelle.Substring(rn.Next(0, Zeichentabelle.Length), 1)
    24. Next
    25. '
    26. MyListText(0) = CStr(ID)
    27. MyListText(1) = Username
    28. MyListText(2) = Passwort
    29. ID += 1
    30. MyListItem = New ListViewItem(MyListText)
    31. ListView1.Items.Add(MyListItem)
    32. Next
    33. End Sub
    34. Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
    35. Try
    36. For Each item As ListViewItem In ListView1.Items
    37. ListBox1.Items.Add(item.Text)
    38. ListBox2.Items.Add(item.SubItems(1).Text)
    39. ListBox3.Items.Add(item.SubItems(2).Text)
    40. Next
    41. MessageBox.Show(ListBox2.Items.Item(CInt(ListView1.SelectedItems(0).Text) - 1))
    42. Catch ex As Exception
    43. TextBox1.Text = ex.ToString
    44. End Try
    45. End Sub
    46. End Class

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

    Wahrscheinlich, weil in diesem Moment kein Item selektiert ist.

    Lass mal die Try..Catch-Anweisung weg und schreibe am Anfang der Sub einfach:

    VB.NET-Quellcode

    1. If ListView1.SelectedItems.Count = 0 Then Return


    Damit wird die Funktion automatisch abgebrochen, wenn kein Element der Listview1 selektiert ist. Und noch so als Zusatzinfo: Es ist besser, wenn du deinen Variablen/Functionen aussagekräftige Namen gibst.
    Technik ... 8|
    Sehr schön, die Exception tritt nicht mehr auf. Jetzt muss ich es nur noch schaffen, den Umweg über die Listboxen wegzulassen. ^^

    Es ist besser, wenn du deinen Variablen/Functionen aussagekräftige Namen gibst.

    Sicher, sobald aus dem Code etwas verwertbares wird, bekommen alle Controls und Variablen auch eindeutigere Namen.

    Um einen Beispielcode hier zu posten, fand ich es sinnvoller, die Namen der Controls so zu belassen, damit derjenige, der sich den Code zum Testen in ein Projekt laden will, nicht erst lange herumrätseln muss, um welche Controls es sich eigentlich handelt und die dann auch noch umbenennen muss, damit der Code lauffähig wird.
    Ok mit der Benennung hast du vielleicht recht so lang es nur zu testzwecken ist.

    Also du willst keine ListBoxen verwenden. Was willst du denn eigentlich mit den ausgewählten Werten machen? Brauchst du den index der ausgewählten Items?
    Nun ja..
    Ich hatte da nur eine Vage Idee.. So wie es sich im Moment entwickelt, könnte es eine Art Zugangsdatenverwaltung werden, also dass damit dann meine Logins gesammelt würden. Das Programm erfasst dann den Loginnamen, das verwendete Passwort und eine Webseitenadresse, oder zu welchen Programm die Logindaten gehören.

    In der Listview würden diese dann alle angezeigt und per Klick auf die jeweilige Zeile in den Zellen entsprechenden Textboxen (oder so) eingetragen werden. Neben letzteren dann evtl noch ein Button, der den Textboxinhalt in die Zwischenablage befördert.

    Der Code würde jetzt schon soweit funktionieren. Zwar umständlich, aber im Ergebnis tut er was ich will.



    Ansonsten denke ich schon, dass ich in Kürze noch dahinterkomme, wie ich dabei richtig vorgehen muss, ich tu mich nur gerade mal wieder etwas schwer beim Zusammenhänge begreifen. :pinch:

    //Edit
    Okay, habe jetzt rausgefunden, wo ich den Denkfehler gemacht habe.
    Da ich die ListView ohnehin bei der späteren Verwendung mittels Daten aus Arrays befülle, brauche ich garnicht die Inhalte des Listviews auszulesen, sondern musste lediglich herausfinden, in welche Zeile ich geklickt habe und kann nun durch folgenden Code die Daten direkt aus den Datenquellen (List (of String)) holen.

    VB.NET-Quellcode

    1. Private Sub ListView1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListView1.SelectedIndexChanged
    2. 'Ausgewählten Listview-Eintrag ausgeben
    3. If ListView1.SelectedItems.Count = 0 Then Return
    4. txtUsername.Text = loUsernamen.Item(CInt(ListView1.SelectedItems(0).Text) - 1)
    5. txtPasswort.Text = loPassworte.Item(CInt(ListView1.SelectedItems(0).Text) - 1)
    6. End Sub

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