ListView Items abfrage

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Saphira104.

    ListView Items abfrage

    Hallo, ich benötige einmal Hilfe.

    Ich möchte per ListView einen Code abrufen nur von bestimten Items, und auch nur so das Admins Offline Produkte nutzen können und User einen Fehler bekommen.

    Ich gehe folgend vor :

    VB.NET-Quellcode

    1. Private Sub Button2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles loadb.Click
    2. If ListView1.Items(0).Selected Then
    3. If ListView1.Items(0).SubItems(4).Text.Contains("Working") Or IsAdmin.Text = "Yes" Then
    4. Dim theSelection As ListView.SelectedListViewItemCollection = ListView1.SelectedItems
    5. Dim item As ListViewItem
    6. For Each item In theSelection
    7. Timer2.Interval = NumericUpDown1.Value
    8. Dim wc As New Net.WebClient()
    9. Dim DownLink As String = Globals.DownLink()
    10. Globals.CreateDirectory()
    11. If IO.File.Exists(Globals.DownLocation) Then
    12. Timer2.Start()
    13. Else
    14. wc.DownloadFile(Globals.DownLink, Globals.DownLocation)
    15. Timer2.Start()
    16. End If
    17. Next
    18. Else
    19. MessageBox.Show("Offline!")
    20. End If
    21. End If
    22. If ListView1.Items(1).Selected Then
    23. If ListView1.Items(1).SubItems(4).Text.Contains("Working") Or IsAdmin.Text = "Yes" Then
    24. Dim theSelection As ListView.SelectedListViewItemCollection = ListView1.SelectedItems
    25. Dim item As ListViewItem
    26. For Each item In theSelection
    27. Timer2.Interval = NumericUpDown1.Value
    28. Dim wc As New Net.WebClient()
    29. Dim DownLink As String = Globals.DownLink()
    30. Globals.CreateDirectory()
    31. If IO.File.Exists(Globals.DownLocation) Then
    32. Timer2.Start()
    33. Else
    34. wc.DownloadFile(Globals.DownLink, Globals.DownLocation)
    35. Timer2.Start()
    36. End If
    37. Next
    38. Else
    39. MessageBox.Show("Offline!")
    40. End If
    41. End If
    42. usw....


    2 Zeilen sind gefüllt die anderen vom ListView LEER !! Es KÖNNEN aber auch mehr Zeilen hinzugefügt oder entfernt werden.

    Soweit Funktioniert alles außer : Ich habe es als "nutzer" getestet der KEIN admin ist und die Zeile auf Offline steht -> gefolgt von MessageBox Offline Text .

    Leider sobald ich die MessageBox OK klicke Crasht mein Code.

    Quellcode

    1. System.ArgumentOutOfRangeException: "InvalidArgument=Value mit dem Wert 2 ist für index ungültig."


    Kommt es dadurch weil ich nicht mehr Zeilen im ListView habe aber der Code mindestens 10 Abfragt ?

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

    Wenn dieser Code Deinem tatsächlichen Code entspricht, dann gehören die Zeilen 4-20 in eine eigene Sub, ggf. noch mehr. Danach sollte es erst weitergehen. Denn jene Zeilen scheinen mit den Zeilen 26-42 identisch zu sein. Danach geht es m.E. sehr viel einfacher, wenn das ListView nicht erlaubt, dass mehrere Items gleichzeitig selektierbar sind. Danach kann man nämlich auf folgendes reduzieren:

    VB.NET-Quellcode

    1. If ListView1.SelectedItems.Count = 0 Then Exit Sub
    2. If ListView1.SelectedItems(0).SubItems(4).Text.Contains("Working") OrElse IsAdmin.Text = "Yes" Then


    btw: Warum heißt der Threadtitel "ListView Überladung Crash"? Was hat das mit Überladung zu tun?
    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.

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

    Saphira104 schrieb:

    Kommt es dadurch weil ich nicht mehr Zeilen im ListView habe aber der Code mindestens 10 Abfragt ?


    ja.
    Eine ArgumentOutOfRangeException kommt, wenn ein Argument out of Range ist. Und der Range dabei ist die Länge der Auflistung.

    Dassis wie im richtigen Leben: Wenn du nur 10 Arbeiter hast, kannst du nicht den 15. ohrfeigen.

    Was ich dir übrigens dringendst empfehle: Visual Studio - Empfohlene Einstellungen

    Mir scheint, du bist am Beginn deiner Progger-Laufbahn, und es ist alles viel vielfach einfacher, wenn man von Anfang an mit einem sinnvoll eingestellten VisualStudio arbeitet. Aber die Notwendigkeit ist im Verlinkten Artikel auch selbst ordentlich begründet.
    Also Must-Do - No Excuses!
    OK danke für die Infos !

    So dachte ich mir das schon wegen dem Fehler ...

    // Überladung deshalb weil öhm was irgendwas zu viel macht was es nicht soll ?!

    Das ListView bringt mich ganz aus dem Konzept .

    Wie meinst du das mit der

    Quellcode

    1. Then Exit Sub


    Ich werde mir das mit Visual Studio morgen in Ruhe durchlesen.

    VB.NET-Quellcode

    1. Private Sub Button2(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles loadb.Click
    2. If ListView1.SelectedItems.Count = 0 Then Exit Sub 'Wenn nix im ListView ausgewählt wurde, Prozedur beenden.
    3. 'Wenn doch, dann mit dem folgenden Code weitermachen

    Überladung ist ein Begriff, der eine spezielle Bedeutung in der Programmierung hat, daher war es (zumindest für mich) verwirrend.

    Wenn Dich das ListView aus dem Konzept bringt, gibt es vielleicht einen einfacheren Weg. Was hast Du denn genau vor bzw. wie lautet das Problem, welches Du denn (derzeit mit dem ListView) lösen willst?
    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.

    Saphira104 schrieb:

    Das ListView bringt mich ganz aus dem Konzept .
    OK.
    Dann solltest Du Dein Konzept überarbeiten und mit einem DataGridView neu beginnen.
    Besser wäre es, wenn Du zunächst Dein Problem beschreiben würdest, ohne irgendwelche Zeilen Quellcodes zur Beschreibung zu verwwenden.
    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!
    DataGridView würde ich gerne vermeiden.

    Um das Problem nochmal genau zu Schildern wäre das ich das ListView mit Inhalten Lade mit Herunterladbaren Inhalten wovon es sich Infos holt aber jede Zeile im ListView andere Inhalte bietet.

    Was ich einfach möchte ist wenn es nicht mehr verfügbar ist solte ein Error erscheinen sobald der User aber ein Admin ist (für Testzwecke) solte es dennoch funktionieren .
    Das Problem an der Sache ist das ListView kann mit nur 2 Zeilen gefüllt sein oder mit mehr als 10 Zeilen. Was abhäng vom Inhalt ist .

    Saphira104 schrieb:

    DataGridView würde ich gerne vermeiden.
    Dann bin ich mal draußen hier. Sorry.
    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!
    @Saphira104 Das ListView ist ein Dinosaurier-Control.
    Probier mal, eine Zeile zu scheiben, wo nur die erste und die siebente Spalte belegt ist.
    Der Zugriff auf Zellen eines DataGridViews passieren per Zeile und Spalte.
    Beim DataGridView nimmst Du eine DataTable, initialisierst die Spalten, befüllst sie mit Daten und weist sie dem DataGridView als DataSource zu, feddich.
    Die Daten kannst Du dann via DataTable in einem Einzeiler als XML speichern und laden.
    Die farbliche Gestaltung kannst Du abhängig von Zeile, Spalte und Inhalt machen.
    Usw.
    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!

    Saphira104 schrieb:

    Oder mal die andere Frage : Was ist am DataGrid Besser als beim ListView? Vorteile und Nachteile?
    Alles.
    Es ist schneller, es unterstützt verschiedene Datentypen (listview kann nur String), der (read/write) Zugriff auf die Werte ist logischer konzipiert, es unterstützt Sortieren, filtern, zufügen, löschen editieren und bietet eine unendliche Menge an Gestaltungsmöglichkeiten - unter anderem kann man ein Dgv so gestalten, dasses von einem Listview kaum zu unterscheiden ist.
    @Saphira104 Gib bitte mal diesem Thread einen Titel, in dem das Wort "Überladung" nicht vorkommt.
    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!
    Done.

    Ok nochmal auf dem Problem zurückzukommen, da ich mich mit dem Datagrid nicht auskenne und ich nun schon soweit alles Fertig habe möchte ich eigentlich beim ListView noch bleiben.

    Gibt es da keine andere Möglichkeit zu Checken wenn das Item ausgewählt ist mit diesen ganzen If ?
    Einzigste Option wäre "Leere" items zu füllen damit der Code nicht durcheinander kommt und eine abfrage hat.

    Saphira104 schrieb:

    wenn das Item ausgewählt ist
    Üblicherweise gibt es da ne Property .SelectedItems, allerdings kenne ich mich da beim ListView nicht aus, musst Du einfach mal probieren, etwa so:

    VB.NET-Quellcode

    1. For Each Item In ListView1.

    VB.NET-Quellcode

    1. SelectedItems
    2. MessageBox(Item.ToString)
    3. Next
    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!
    Das Problem habe ich nun sauber behoben !

    Es lag an .SelectedItems das mit .Items tauschen da es sonst Doppelt Abgefragt wird .


    VB.NET-Quellcode

    1. If ListView1.SelectedIndices.Count = 1 Then
    2. Select Case ListView1.SelectedIndices(0)
    3. Case 0
    4. If ListView1.Items(0).SubItems(4).Text.Contains("Working") OrElse IsAdmin.Text = "Yes" Then