2 Listview's auf gleiche Einträge prüfen

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von TRiViUM.

    2 Listview's auf gleiche Einträge prüfen

    Hallo fleißige Helferlein,

    Ich habe 2 Listviews mit jeweils 2 Spalten.

    1 Listview ist immer gefüllt, die ande wird jedesmal neu gefüllt.
    Ich möchte, dass wenn die 2te neu gefüllt wird, geprüft wird, ob der Eintrag bereits in der 1 Listview vorhanden ist.
    Falls ja, soll der Hintergrund des Eintrags z.b. Rot werden.

    Ich habs bereits hier mit probiert:

    VB.NET-Quellcode

    1. Dim lines() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\test.txt", System.Text.Encoding.Default)
    2. For Each line As String In lines
    3. Dim Split() As String = line.Split(CChar("$"))
    4. Dim NeueZeile As New ListViewItem(New String() {Split(0), Split(1)})
    5. ListView1.Items.Add(NeueZeile)
    6. For Each lwi As ListViewItem In ListView2.Items
    7. If Split(1) = lwi.SubItems(0).Text Then
    8. NeueZeile.BackColor = Color.Red
    9. End If
    10. Next
    11. Next



    Was mach ich da falsch?


    & Danke! ;)

    TRiViUM schrieb:

    VB.NET-Quellcode

    1. If Split(1) = lwi.SubItems(0).Text

    Sollten die Zahlen nicht gleich sein?

    TRiViUM schrieb:

    VB.NET-Quellcode

    1. Dim NeueZeile As New ListViewItem(New String() {Split(0), Split(1)})
    2. ListView1.Items.Add(NeueZeile)
    3. ............
    4. NeueZeile.BackColor = Color.Red


    Du hast erst das Item hinzugefügt, dann verändert. Bist du sicher, dass die Änderungen auf diese Art und Weise übernommen werden?
    Also Split(0) ist im prinzip lwi.item.text, also der text, der in der ersten spalte steht.
    Und Split(1) dann Subitem(0).text des Eintrags, wenn ich mich nicht irre ?! :whistling:


    Eigentlich schon, denn man kann ja auch bereits hinzugefügte Items im nachhinein farblich verändern...
    Andersrum hab ichs aber auch schon probiert, geht genau so wenig oO

    Es soll jedenfalls der text aus der 2ten Spalte der ersten Listview mit dem text aus der 2ten Spalte des 2ten Listviews verglichen werden.

    EDIT:
    Ich nehm das mit Subitem(0).text zurück, denn das ist das selbe wie lwi.text ^^
    ->Geändert auf Subitem(1).text

    Dennoch will es nicht funktionieren ?(

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

    TRiViUM schrieb:

    Eigentlich schon, denn man kann ja auch bereits hinzugefügte Items im nachhinein farblich verändern...
    Andersrum hab ichs aber auch schon probiert, geht genau so wenig oO


    Man kann die Items verändern, allerdings muss man sie dann über ListView.Item ansprechen oder? Und nicht über ein Objekt, welches schon vorher hinzugefügt wurde. Wie hast du es andersrum probiert (und hast du da schon 0 und 1 angepasst)?

    sonne75 schrieb:

    Man kann die Items verändern, allerdings muss man sie dann über ListView.Item ansprechen oder? Und nicht über ein Objekt, welches schon vorher hinzugefügt wurde. Wie hast du es andersrum probiert (und hast du da schon 0 und 1 angepasst)?
    ja genau, 0 mit 1 getauscht.

    Ich hab ein anderes Projekt erstellt, mit nur 1 Listview + 2 Spalten.
    da hab ich dann 10 items hinzugefügt.

    im button steht dann folgender code:

    VB.NET-Quellcode

    1. For Each LWI As ListViewItem In ListView1.Items
    2. If LWI.SubItems(1).Text = "test" Then LWI.BackColor = Color.Red
    3. Next

    Das funktioniert.

    @ErfinderDesRades:
    Damit werd ich mich wohl oder übel auseinander setzen müssen, wollte wieso mal vom listview weg :D
    Aber tzdm möcht ich wissen, wo da der fehler liegt :huh:
    Du siehst doch, wo der Fehler liegt - in deinem letzten Beispielcode hast du das Item direkt angesprochen.

    Poste deinen Code, wo du richtig (0 und 1 richtig rum) vergleichst und richtig das Item ansprichst. Und probiere ihn natürlich auch aus.
    Merkwürdig, das mit dem split(1) zu nehmen, hatte ich nur probiert, weil es zuerst nicht funktioniert hatte, wenn ich subitems(1) genommen hatte.

    Also es funktioniert in einem anderen projekt mit folgendem code:

    VB.NET-Quellcode

    1. For Each lwi As ListViewItem In ListView1.Items
    2. For Each lwi2 As ListViewItem In ListView2.Items
    3. If lwi.SubItems(1).Text = lwi2.SubItems(1).Text Then
    4. lwi.BackColor = Color.Green
    5. End If
    6. Next
    7. Next


    und in dem eigentlichen projekt nicht.

    Die listviews befinden sich auf 2 verschiedenen formen, welche aber gleichzeitig zu sehen sind...

    TRiViUM schrieb:

    Die listviews befinden sich auf 2 verschiedenen formen

    Aha! :!:

    Und in welcher Form befindet sich dein Code? Und wie sprichst du die ListView der anderen Form an? Aus deinem Code geht heraus, dass beide ListView sich in der gleichen Klasse (Form ist auch nur eine Klasse) befinden... Dabei ist die andere ListView ein Objekt aus einer ganz anderen Klasse. D.h. du brauchst ein Objekt der Klasse "Form2" und dann kannst du dieses Objekt anzeigen und auf seine ListView zugreifen.

    VB.NET-Quellcode

    1. Dim frm2 As New Form2
    2. frm2.Show()
    3. ...........
    4. if frm2.ListView.Items.........

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

    das Aha klang ja schonmal ganz gut :D
    hab ich mir grad auch als Grund überlegt..

    Also der Code steht in der Form von der Listview, die immer neu gefüllt wird.

    Die eine Form mit der Listview die immer gefüllt ist, kann ich ja nicht einfach mit dim frm2 as New Form2 deklarieren, denn dann sind die ganzen items weg...weil sie die Items von einer Datei läd.

    Oder?

    sonne75 schrieb:

    VB.NET-Quellcode

    1. Dim frm2 As New Form2
    2. frm2.Show()
    3. ...........
    4. if frm2.ListView.Items.........
    Dann eigentlich genau anders rum.

    Also frm1 Listview ist die Listview1, die bereits gefüllt ist.
    und über frm1 kann man frm2 aufrufen, wo dann die Items der Listview2 neu gefüllt werden.
    und in der frm2 sollen dann die Items farblich geändert werden, welche bereits in frm1 Listview1 existieren.

    Die Permanent-Listview wird über das Load-Ereignis der frm1 gefüllt (vom Füll-Prinzip genau wie frm2 Listview):

    VB.NET-Quellcode

    1. Dim lines() As String = System.IO.File.ReadAllLines(Application.StartupPath & "\tmp", System.Text.Encoding.Default)
    2. For Each line As String In lines
    3. Dim Split() As String = line.Split(CChar("$"))
    4. Dim NeueZeile As New ListViewItem(New String() {Split(0), Split(1)})
    5. ListView1.Items.Add(NeueZeile)
    6. Next

    TRiViUM schrieb:

    und über frm1 kann man frm2 aufrufen, wo dann die Items neu gefüllt werden.


    Kannst du mal erzählen, was genau in deinem Programm passiert? Was steht in den ListViews, in welchem Fall wird "frm2" aufgerufen und warum werden da die Einträge einzeln gezeigt?

    Ich glaube mittlerweile, dass es bei dir so verstrickt ist, dass du wirklich auf den Rat von @ErfinderDesRades hören und deine ListView-Frickelei gleich rausschmeißen solltest.

    Wenn es dich interessiert, wo der Fehler lag: erstens der Index, zweitens die Anrede über bereits hinzugefügtes Objekt und drittens Ansprache von falschen Listview über unterschiedliche Formen.
    Also:

    Frm1 ist eine Art Senderliste.
    Spalte1=Sendername, Spalte2=Sender Adresse.
    Diese werden aus einer gespeicherten Datei geladen.

    Frm2 ist eine Form, wo man nach neuen Sendern suchen kann.
    Die Listview der Fmr2 wird gefüllt, sobald man aus einer Combobox eine Kategorie ausgewählt hat.
    Das ist dann eine Liste, die von einem Server geladen, und über den beschriebenen Code in die Listview2 gefügt wird.
    Damit man weiß, welche Sender man halt bereits in der Listview der frm1 hat, sollen diese farblich gekennzeichnet werden.

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

    TRiViUM schrieb:

    Die Listview der Fmr2 wird gefüllt, sobald man aus einer Combobox eine Kategorie ausgewählt hat.
    Das ist dann eine Liste, die von einem Server geladen, und über den beschriebenen Code in die Listview2 gefügt wird.


    Wo kommen die neuen Sender her? Verstehe ich es richtig, dass du in der frm2 dann die Internetsuche startest bzw. neue Liste lädst?

    Wie greifst du denn auf die Liste der frm1 im Code der frm2 zu?

    Ich würde sagen, du solltest einfach eine Dim SavedSenderList As New List (Of Sender) anlegen, in die die Daten von der gespeicherten Datei kommen. Sender ist deine Klasse, in der Name und Adresse stehen. Diese List lädst du am Anfang und übergibst im Konstuktor der frm2 mit.

    VB.NET-Quellcode

    1. Dim OldList As New List (Of Sender)
    2. Public Sub New (ByVal lst As List (of Sender))
    3. OldList=lst
    4. End Sub


    VB.NET-Quellcode

    1. Dim frm2 As New Form2(SavedSenderList)

    Dann hst du die Daten in deiner frm2 und kannst sie vergleichen. Die Daten, die neu runtergeladen werden, sollen auch in so einer Liste abgespeichert werden (NewSenderList), und verglichen werden nicht die Anzeigeelemente, sondern jeweils die List-Elemente.

    Die SavedSenderList und NewSenderList werden jeweils an die Anzeige (z.B. DataGridView) gebunden.