Checkedlistbox Items selektieren wenn String nicht gleich mit CLB2

  • VB.NET

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von Kay Petri.

    Checkedlistbox Items selektieren wenn String nicht gleich mit CLB2

    Hallo Ihr,

    ich habe da eine Frage welche die Spezialisten wahrscheinlich recht einfach lösen können.

    Ich habe 2 CheckLBs in denen Daten agezeigt werden. In der Mitte habe ich ein Listbox welche mir anzeigt, welche Daten der beiden CLB gleich sind.
    Ich möchte allerdings erreichen, dass alle Items aus CLB1 selectiert werden, die nicht gleich mit CLB2 sind.
    Also eine automatische selektierung der Items. Hier mal der Code den ich schon habe.

    VB.NET-Quellcode

    1. For Each item In CheckedListBox2.Items
    2. If CheckedListBox1.Items.Contains(item) Then
    3. ListBox1.Items.Add(item)
    4. End If
    5. Next
    6. '-----------Items selektieren die nicht gleich sind
    7. For Each item In CheckedListBox2.Items
    8. If Not CheckedListBox1.Items.Contains(item) Then
    9. CheckedListBox1.Items.Item(item).selected = True
    10. End If
    11. Next


    Ich bekomme nun eine Fehlermeldung:
    "Ungültige Konvertierung von der Zeichenfolge xxx in Typ Integer"
    Und zwar bei dem ersten Item das nicht gleich ist.

    Jemand evtl. einen Rat?

    Gruß Kay
    Guten Morgen,

    also ich würde das nicht mit 2 Schleifen lösen.
    Versuch es evtl mal so:

    VB.NET-Quellcode

    1. For i As Integer = 0 to CheckedListBox2.Items.Count - 1
    2. If CheckedListBox1.Items.Contains(CheckedListBox2.Items.Item(i)) then
    3. Listbox1.Items.Add(CheckedListBox2.Items.Item(i))
    4. else
    5. CheckedListBox1.Items.Item(i).Selected = True
    6. End If
    7. Next


    Habs jetzt einfach so aus dem Gedächnis geschrieben aber sollte evtl. funktionieren.
    Aber nur, wenn in der CheckedListBox1 und CheckedListBox2 die gleiche Anzahl der Elemente und evtl. genau die gleichen Elemente.
    Ansonsten ist dein Fehler, das in der 2. Schleife kein Item angegeben werden kann, sondern nur ein Integer.

    Also so sollte es z.B. sein

    VB.NET-Quellcode

    1. CheckedListBox1.Items.Item(ItemIndex).selected = True

    Du musst dann halt nur den Index des Items angeben.

    Ich hoffe, ich habe dir damit weiter geholfen.

    MfG pc-freack
    Gib Deinem Projekt zunächst Option Strict On, da sagtr Dir der Compiler, was ihm nicht gefällt.
    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!
    Versuch es so mal. Sollte nun eigentlich funktionieren.
    Also das hier ist jetzt nur die 2. Schleife. Das ist ja das Problem.

    VB.NET-Quellcode

    1. For Each item In CheckedListBox1.Items
    2. If Not CheckedListBox2.Items.Contains(item) Then
    3. item.Checked = True
    4. End If
    5. Next

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „pc-freack“ ()

    Was hat

    Kay Petri schrieb:

    Das Problem ist, dass ich den Index ja nicht kenne, ...
    mit

    RodFromGermany schrieb:

    Option Strict On
    zu tun :?:
    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!
    AlsoNichts. Ich hatte nur auf pc-freak sein Beitrag geantwortet.
    Mit Option Strict On bekomme ich die Meldung, dass

    "Checked kein späteres Binding zulässig" oder so ähnlich. Weis ich gerade nicht merh aus dem Kopf. (Bin gerade auf Arbeit)

    Ohne Option Strict ON bekomme ich nach pc-freak seinem letzten Beispiel die Meldung:

    ".. checked kein öffentlicher member vom typ string" oder sowas. habe mir die Meldungen leider nicht richtig gemerkt. Aber heute Abend kann ich das genau schreiben. Diese Meldung kommt auch wenn ich statt checked die selected Funkton nutze. Also in diesem beispiel z.B.:

    VB.NET-Quellcode

    1. CheckedListBox1.Items.Item(ItemIndex).selected = True


    Ich habe jetzt einfach mal versuch das er gleich mal alle Items in CLB1 markiert bevor er die Auswhal macht. Das geht ebenfalls nicht.
    Es schon etwas erstaunlich wie kompliziert es ist einfach nur via Vb die Items zu markieren und demarkieren.

    Kay Petri schrieb:

    "Checked kein späteres Binding zulässig" oder so ähnlich.

    Da hast Du eine Variable vom Typ Object, die eigentlich vom Typ CheckBox oder so sein will.
    Da musst Du halt die Variable zunächst Casten:

    VB.NET-Quellcode

    1. Dim ob As Object = New CheckBox ' Dein Wert halt
    2. Dim cb As CheckBox
    3. If TypeOf (ob) Is CheckBox Then
    4. cb = DirectCast(ob, CheckBox)
    5. End If
    6. ' mit cb weiterarbeiten
    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!
    Ok. Das werde ich heute Abend so machen, dann sehen wir was Vb diesmal einfällt. :)
    Wie zu erwarten war bekomme ich es nicht hin. Dafür bin ich zu unerfahren. Ich habe das jetzt sicher auch total falsch angewendet:

    Fehlermeldung: "Option Strict On" lässt spätes Binden nicht zu. Bei item.Checked = True

    VB.NET-Quellcode

    1. Dim ob As Object = CheckedListBox2 ' Dein Wert halt
    2. Dim cb As CheckedListBox
    3. If TypeOf (ob) Is CheckedListBox Then
    4. cb = DirectCast(ob, CheckedListBox)
    5. End If
    6. ' mit cb weiterarbeiten
    7. For Each item In CheckedListBox1.Items
    8. If Not cb.Items.Contains(item) Then
    9. item.Checked = True
    10. End If
    11. Next


    Wenn ich das CB bei der CLB1 einsetzte kommt selbige Meldung.

    Kay Petri schrieb:

    Wie zu erwarten war bekomme ich es nicht hin.
    So war das auch nicht gemeint.
    Diese Zeile schlägt fehl:

    Kay Petri schrieb:

    VB.NET-Quellcode

    1. CheckedListBox1.Items.Item(item).selected = True
    Items.Item(item) gibt ein Object zurück, das musst Du casten.
    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!
    Achso. Also wenn ich Dich richtig verstehe, dann sollte das so aussehen?

    VB.NET-Quellcode

    1. Dim ob As Object = CheckedListBox1.Items.Item(ItemIndex).selected = True ' Dein Wert halt
    2. Dim cb As CheckedListBox
    3. If TypeOf (ob) Is CheckedListBox Then
    4. cb = DirectCast(ob, CheckedListBox)
    5. End If
    6. ' mit cb weiterarbeiten
    7. For Each item In CheckedListBox2.Items
    8. If Not CheckedListBox1.Items.Contains(item) Then
    9. cb
    10. End If
    11. Next


    ??

    Kann nat. sein dass das wieder totaler Müll ist, aber ich bin guter Hoffnung das ich es auch noch lernen werde.
    Nein.

    Kay Petri schrieb:

    VB.NET-Quellcode

    1. For Each item In CheckedListBox2.Items
    2. If CheckedListBox1.Items.Contains(item) Then
    3. ListBox1.Items.Add(item)
    4. End If
    5. Next
    6. '-----------Items selektieren die nicht gleich sind
    7. For Each item In CheckedListBox2.Items
    8. If Not CheckedListBox1.Items.Contains(item) Then
    9. CheckedListBox1.Items.Item(item).selected = True
    10. End If
    11. Next

    VB.NET-Quellcode

    1. For Each item In CheckedListBox2.Items
    2. If CheckedListBox1.Items.Contains(item) Then
    3. ListBox1.Items.Add(item)
    4. End If
    5. Next
    6. '-----------Items selektieren die nicht gleich sind
    7. For Each item In CheckedListBox2.Items
    8. If Not CheckedListBox1.Items.Contains(item) Then
    9. Dim ob As Object = CheckedListBox1.Items.Item(item)
    10. ' hier musst Du was tun
    11. 'CheckedListBox1.Items.Item(item).selected = True
    12. End If
    13. 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!
    Es ist viel einfacher, 10 Sekunden mit Frau Google gesprochen:

    VB.NET-Quellcode

    1. CheckedListBox1.SetItemChecked(2, True)
    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!
    Ok. Habe gerade selber mal danach den Herrn google gefragt. Das sieht recht simpel aus und es wäre das was ich benötige. Verdammt, warum bin ich jetzt auf Arbeit und kann das nicht testen.

    VB.NET-Quellcode

    1. For Each item In CheckedListBox2.Items
    2. If Not CheckedListBox1.Items.Contains(item) Then
    3. CheckedListBox1.SetItemChecked(item, True)
    4. End If
    5. Next


    Das sollte es doch dann sein.

    Kay Petri schrieb:

    Das sollte es doch dann sein.
    So isses. :D
    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!
    Hmm. Was soll ich sagen. Es geht nicht.

    Es kommt nun folgende Fehlermeldung.

    Ungültige Konvertierung von der Zeichenfolge simracing-pro_TCC_Nexoc.Store 1_ in Typ Integer

    Ich habe keine Ahnung warum er jetzt den String des Items nutzt, anstatt nur das verdammte item zu marklieren.

    EDIT: (wieso kann ich denn nur alle 30min. einen Post verfassen)

    Ich habe eine halbwegs Lösung nun doch gefunden. Das ist am Ende gerade ein code Mischmasch. Aber das gröbste funktioniert.

    VB.NET-Quellcode

    1. For i1 As Integer = 0 To CheckedListBox1.Items.Count - 1
    2. CheckedListBox1.SetItemChecked(i1, True)
    3. Next
    4. '--------- vergleichen der Einträge auf gleichen Inhalt.
    5. For i As Integer = 0 To CheckedListBox1.Items.Count - 1
    6. If CheckedListBox1.Items.Contains(CheckedListBox2.Items.Item(i)) Then
    7. ListBox1.Items.Add(CheckedListBox2.Items.Item(i))
    8. 'CheckedListBox2.Items.Add("fehlender Skin")
    9. CheckedListBox1.SetItemChecked(i, False)
    10. End If
    11. Next


    Jetzt hat sich allerdings ein neues Problem aufgetan. Er vergleicht jetzt einfach nur die Items der Reihe nach. Gehen wir mal davon aus dass die inhalte Alphabethisch geordnet sind und ich lösche den Buchstaben "n" aus dem Inhalt der CLB2. Er erkennt nun dass eine Item nicht überein stimmt. Aber anstatt dieses zu markieren welches nicht stimmt, markiert er einfach des letzte. Also das "Z" angenommen. Das ist doch merkwürdig, weil ich doch den vergleich der CLB mache jedes Item einzeln und sofort selektieren. Nicht erst wenn er alle items durch gegangen ist.

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

    Kannst Du mal ein Beispiel machen, das nicht funktioniert?
    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!
    Soo. Habe jetzt mal was gemacht für euch zum test.

    Ihr bekommt eine Form in der 2 CBL und 1 Listbox sind.

    Die linke CLB1 stellt den Inhalt als Zip Daten auf einem Server dar(hier als lokaler ordner simuliert). Die CLB2 auf der rechten Seite zeigt die Files die bereits lokal existieren und entpackt sind.
    Damit er die Strings ordentlich vergleicht, füge ich in der CLB2 die Endung ZIP hinzu.

    Die LB in der Mitte sollte mir darstellen welchen Strings denn gleich sind.

    Ziel ist es eine Automatische selektierung in CLB1 zu machen wenn diese Strings nicht schon lokal vorhanden sind. Das war es dann eigentlich auch schon.

    Ich habe es so weit, dass er selektiert wenn ein String lokal nicht da ist. jedoch markiert er dann den falschen.

    Die beiden CLBTEST ordner müsst ihr in eigene Dokument entpacken.
    Dateien
    • CLBTest.zip

      (12,35 kB, 110 mal heruntergeladen, zuletzt: )
    Sorg doch bitte erst mal dafür, dass das Programm in jedem Ordner läuft, also auch in C:\Temp.
    Bilder
    • Argument.jpg

      8,01 kB, 323×113, 143 mal angesehen
    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!