CheckedListBox

  • VB.NET

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

    CheckedListBox

    Ich bin ziemlich neu hier

    Das Programmieren ist nur als Spaß bei mir und ich verfüge keine großen Kenntnisse so zu sagen Anfänger.

    Ich versuche mir eine Erleichterung für die Arbeit zur erstellen dafür habe ich mir ein kleinen Tool im Visual Basic Express 2012 gebastelt mit vielen TextBoxen und 3 CheckedListBox.

    Alles soweit gut das Tool Rechnet so wie es sein soll das einzige Problem wobei ich noch habe ist Speichern und lädt.

    Das Tool soll durch Click Button sachen aus der TextBoxen sowie CheckedListBox Speichern , das ist mir auch gelungen.

    Durch sw.WriteLine soll als text Speichern, später soll das ganze passieren auf Firmen Netzwerk. Das Einlesen soll aber von mehreren PC Stationen die im Netzwerk hängen abrufbar sein.

    VB.NET-Quellcode

    1. PrivateSub SpeichernToolStripMenuItem_Click(sender AsObject, e AsEventArgs) Handles SpeichernToolStripMenuItem.Click
    2. Using sw As System.IO.StreamWriter = New System.IO.StreamWriter("D:\WBC\Auftragsnummer - " & Auftragsnummer.Text & ".txt", False)
    3. sw.WriteLine(Auftragsnummer.Text)
    4. sw.Write("")
    5. sw.WriteLine(Rollen_Katalognummer.Text)
    6. sw.Write("")
    7. sw.WriteLine(Charge.Text)
    8. sw.Write("")
    9. For i AsInteger = 0 To schmalrollen.CheckedItems.Count - 1
    10. sw.WriteLine(schmalrollen.CheckedItems(i))
    11. Next
    12. For i AsInteger = 0 To Standardrollen.CheckedItems.Count - 1
    13. sw.WriteLine(Standardrollen.CheckedItems(i))
    14. NextFor i AsInteger = 0 To Schicht_auswahl.CheckedItems.Count - 1
    15. sw.WriteLine(Schicht_auswahl.CheckedItems(i))
    16. Next
    17. sw.WriteLine("")
    18. sw.Write("")
    19. sw.Close()
    20. EndUsing
    21. EndSub



    Aber jetzt komme ich nicht weiter bei einlesen d.h Textboxen werden eingelesen durch sr.ReadLine aber die CheckedListBox nicht.

    VB.NET-Quellcode

    1. PrivateSub LadenToolStripMenuItem_Click(sender AsObject, e AsEventArgs) Handles LadenToolStripMenuItem.Click
    2. Dim i AsIntegerDim sr AsNew System.IO.StreamReader("D:\WBC\Auftragsnummer - " & Auftragsnummer.Text & ".txt", False)
    3. Auftragsnummer.Text = sr.ReadLine
    4. Rollen_Katalognummer.Text = sr.ReadLine
    5. Charge.Text = sr.ReadLine
    6. For i = 0 To schmalrollen.Items.Count - 1
    7. sr.ReadLine()schmalrollen.SetItemChecked(i, True)
    8. Next
    9. 'sollen 2 weitere CheckedListBox
    10. sr.Close()
    11. EndSub
    12. EndClass


    Da brauche ich Hilfe von euch wie ich das besten lösen kann.

    In die CheckedListBox sind bis zur 7 Einträge vorhanden es können mehrere angeklickt werden die bei Speichern auch gespeichert werden nur das Einlesen klappt es nicht, außer Textboxen die sehe ich nach eingabe von Auftragnummer

    Danke im Voraus für Eure Unterstützung.

    dazu hänge ich ein Bild von diesen Tool

    Wo hats du den deine daten die du Benötigst. du mist Jede Listbox mit einer Schleife Einlesen. d.h.: ungefähr so

    VB.NET-Quellcode

    1. Dim reader as new io.streamreader(deinedatei)
    2. while reader.peek <>-1
    3. me.listbox1.item.add(reader.readline)
    4. me.listbox2.item.add(reader.readline)
    5. me.listbox3.item.add(reader.readline)
    6. End While


    und für deine Tabelle würde ich ein Datagridview Benutzen, ist Dynamischer und du kannst auch die Versiedenen
    Komponenten Hinzufügen. Nur beim Datagridview hast du mehr als 9 Zeilen
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

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

    Hallo,

    @Andy16823
    Wo siehst du denn bitte eine Listbox auf dem Screenshot?? Ich würde dem @TE allerdings auch ein DataGridView empfehlen :)

    @ijokur
    Dein Problem ist vermutlich folgendes: Du schreibst nur die ausgewählten Items der CheckedListBox in die Textdatei. Wenn es mehrere CheckedListBoxen sind, gibt es keine Trennung zwischen den Einträgen der verschiedenen CheckedListBoxen. Auch kannst du den Index nicht aus den Einträgen herauslesen. So ist es beinahe unmöglich die richtigen Items auszuwählen. Es gibt mehrere Möglichkeiten, wie du dieses Problem löst. Ich beschreibe jetzt einmal eine Möglichkeit.

    Du schreibst in die Textdatei alle Items der Checkelistbox und zu den Items jeweils noch True oder False (je nach dem ob sie ausgewählt wurden oder nicht):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New System.IO.StreamWriter("DeineDatei")
    2. 'Alle Items der CheckedListBox durchgehen
    3. For i As Integer = 0 To CheckedListBox1.Items.Count - 1
    4. 'Herausfinden, ob Item ausgewählt ist oder nicht
    5. Dim cs As Boolean = CheckedListBox1.GetItemChecked(i)
    6. 'in Textdatei schreiben Item, True oder False
    7. sw.WriteLine(CheckedListBox1.Items(i).ToString & "," & cs)
    8. Next
    9. sw.Close()


    Das Einlesen funktioniert dann so:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sr As New System.IO.StreamReader("DeineDatei")
    2. 'Alle Items der CheckedListBox durchgehen
    3. For i As Integer = 0 To CheckedListBox1.Items.Count - 1
    4. 'Zeile bei "," splitten -> in splitstr(1) ist True oder False -> Checked oder Unchecked
    5. Dim splitstr() As String = Split(sr.ReadLine(), ",")
    6. If splitstr(1) = "True" Then
    7. 'Falls True dann Item auswählen
    8. CheckedListBox1.SetItemChecked(i, True)
    9. Else
    10. 'Sonst Item deselektieren
    11. CheckedListBox1.SetItemChecked(i, False)
    12. End If
    13. Next
    14. sr.Close()


    Funktioniert natürlich auch bei mehreren CheckedListBoxen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub WriteItems()
    2. 'CheckedListBox1
    3. Dim sw As New System.IO.StreamWriter("DeineDatei")
    4. For i As Integer = 0 To CheckedListBox1.Items.Count - 1
    5. Dim cs As Boolean = CheckedListBox1.GetItemChecked(i)
    6. sw.WriteLine(CheckedListBox1.Items(i).ToString & "," & cs)
    7. Next
    8. 'CheckedListBox2
    9. For i As Integer = 0 To CheckedListBox2.Items.Count - 1
    10. Dim cs As Boolean = CheckedListBox2.GetItemChecked(i)
    11. sw.WriteLine(CheckedListBox2.Items(i).ToString & "," & cs)
    12. Next
    13. sw.Close()
    14. End Sub
    15. Private Sub ReadItems()
    16. 'CheckedListBox1
    17. Dim sr As New System.IO.StreamReader("DeineDatei")
    18. For i As Integer = 0 To CheckedListBox1.Items.Count - 1
    19. Dim splitstr() As String = Split(sr.ReadLine(), ",")
    20. If splitstr(1) = "True" Then
    21. CheckedListBox1.SetItemChecked(i, True)
    22. Else
    23. CheckedListBox1.SetItemChecked(i, False)
    24. End If
    25. Next
    26. 'CheckedListBox2
    27. For i As Integer = 0 To CheckedListBox2.Items.Count - 1
    28. Dim splitstr() As String = Split(sr.ReadLine(), ",")
    29. If splitstr(1) = "True" Then
    30. CheckedListBox2.SetItemChecked(i, True)
    31. Else
    32. CheckedListBox2.SetItemChecked(i, False)
    33. End If
    34. Next
    35. sr.Close()
    36. End Sub



    Zu beachten: Zwischen den Zeilen dürfen keine leeren Zeilen sein. Auch keine Leerzeile zwischen den Items zweier CheckedListBoxen. Ansonsten musst du den Code noch anpassen. Und natürlich auch wichtig: In der richtigen Zeile anfangen. Sonst werden falsche Items ausgewählt. :)

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    Ich Würde die Daten, nach meinen Neuesten Erkenntissen mit xml Verarbeiten, ist leicht zu
    Verstehen und leicht Anzuwenden. Und auch sehr Stabil.
    @TE Du kannst ja mal deinen SourceCode Posten das wir uns dein Problemm Besser Annähren Können
    und uns ein Bild davon machen können.
    Meine Projekte Genesis Game Engine | GFX | smartli.me - Der smarte URL shortener

    @ErfinderDesRades

    Hi

    Wie ich schon erwente meine kenntnisse reichen nicht für komplexe Programme. Das Tool soll nur ein Text generieren so das meine Kolegen die an jewaligen Auftrag von eine andere anlage daten abholen und bearbeiten können.

    @Switcherlapp97

    Vielen Dank für deine Antwort, ich hab deine variante gennomen und es Funktioniert.

    aber wäre es mir lieber wenn nicht über True oder False abgefragt wird sondern durch das gespeicherte Text sondern so wie es gespeichert ist.

    3000121212
    111111111111111
    11111111
    M 43
    M 45
    Schicht B

    nichts trotz dem danke :P

    ijokur schrieb:

    Wie ich schon erwente meine kenntnisse reichen nicht für komplexe Programme.
    Tja, dein Bildle in post#1 zeigt aber eine ich finde eindeutig komplexe Oberfläche.
    Da muß man sich entweder die notwendigen Kenntnisse für anlernen, oder man wird sich was zurechtmurksen, mit erheblichem Aufwand und ungewissem Ausgang, obs am Ende ühaupt funzt.
    Meine Empfehlung: Wenn dir proggen Spaß macht, dann ist das vlt. die Gelegenheit, was wirklich neues zu lernen, ein bischen sehr feine Technologie, die man übrigens auch in ungefähr jeder weiteren Anwendung gewinnbringend einsetzen kann.
    Hallo,

    ijokur schrieb:

    aber wäre es mir lieber wenn nicht über True oder False abgefragt wird sondern durch das gespeicherte Text sondern so wie es gespeichert ist.

    3000121212
    111111111111111
    11111111
    M 43
    M 45
    Schicht B

    Deutsch ist auch nicht so deine Stärke ;)
    So wie du es oben beschrieben hast, ist es natürlich auch möglich. Ist eben beim Einlesen etwas anspruchsvoller. Was das für einen Unterschied macht, ob da noch ein True oder ein False in der Textdatei dabei steht oder nicht, ist mir nicht ganz klar. Jetzt ein kleines Beispiel mit zwei CheckedListBoxen:

    In Textdatei schreiben (nur die CheckedItems) -> ist natürlich einfacher, wie bei meinem ersten Beipsiel:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New StreamWriter("DeineDatei")
    2. 'CheckedListBox1 in txt schreiben
    3. For i As Integer = 0 To CheckedListBox1.CheckedItems.Count - 1
    4. sw.WriteLine(CheckedListBox1.CheckedItems(i).ToString)
    5. Next
    6. 'CheckedListBox2 in txt schreiben
    7. For i As Integer = 0 To CheckedListBox2.CheckedItems.Count - 1
    8. sw.WriteLine(CheckedListBox2.CheckedItems(i).ToString)
    9. Next
    10. sw.Close()


    Nun das Einlesen deiner Textdatei:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. 'bei allen Items in CheckedListBox1 das Häckchen weg (falls noch gesetzt)
    2. For i As Integer = 0 To CheckedListBox1.Items.Count - 1
    3. CheckedListBox1.SetItemChecked(i, False)
    4. Next
    5. 'bei allen Items in CheckedListBox2 das Häckchen weg (falls noch gesetzt)
    6. For i As Integer = 0 To CheckedListBox2.Items.Count - 1
    7. CheckedListBox2.SetItemChecked(i, False)
    8. Next
    9. Dim sr As New StreamReader("DeineDatei")
    10. Dim lines As New List(Of String)
    11. 'Alle Zeilen lesen, die noch nicht gelesen wurden einer List(Of String) hinzufügen
    12. Do Until sr.Peek = -1
    13. lines.Add(sr.ReadLine)
    14. Loop
    15. 'Alle Einträge der List(Of String) durchgehen
    16. For Each item As String In lines
    17. 'Alle Items der CheckedListBox1 durchgehen
    18. For i As Integer = 0 To CheckedListBox1.Items.Count - 1
    19. 'Überprüfen, ob der Eintrag mit einem Item in CheckedListBox1 übereinstimmt
    20. If item = CheckedListBox1.Items(i).ToString Then
    21. 'Wenn ja: Häckchen bei Item setzen
    22. CheckedListBox1.SetItemChecked(i, True)
    23. End If
    24. Next
    25. 'Alle Items der CheckedListBox2 durchgehen
    26. For i As Integer = 0 To CheckedListBox2.Items.Count - 1
    27. 'Überprüfen, ob der Eintrag mit einem Item in CheckedListBox2 übereinstimmt
    28. If item = CheckedListBox2.Items(i).ToString Then
    29. 'Wenn ja: Häckchen bei Item setzen
    30. CheckedListBox2.SetItemChecked(i, True)
    31. End If
    32. Next
    33. Next
    34. sr.Close()


    Ein paar Kommentare:
    - Falls zwei oder mehrere Items den selben Text haben, wird bei beiden das Häckchen gesetzt (das ist bei dir glaube ich eh nicht der Fall)
    - Wieder an der richtigen Stelle in der Textdatei mit dem Einlesen der Items beginnen :)
    - Keine Leerzeilen zwischen den Zeilen bzw. andere Trennungen zwischen den verschiedenen CheckedListBoxen, sonst musst du den Code noch ein bisschen anpassen :)

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    hi

    @Switcherlapp97

    funktioniert einwandfrei so wie ich das haben wollte

    Hintergrund war dass die Kollegen aus anderer Abteilung die können die Text Datei öffnen und die Daten vorzeitig bearbeiten bevor die es auf dem Tisch bekommen.

    das Einlesen sowie Schreiben

    noch einmal Vielen Danke

    falls ich Fragen noch habe kann ich hier weiter stellen
    noch eine frage

    in meiner Form habe ich viele einzelne Checkboxen

    bei sw. WriteLine werden die auch gespeichert als True oder False

    aber wieder bei einlesen habe ich Probleme, entweder werden die Checkboxen als Checked markiert oder passiert gar nichts.

    Muss ich für jede einzelne Checkbox Code schreiben oder kann man das über als Schleife Container der gruppe z.b Restrolle (Restrolle1, Restrolle2…..) einlesen
    Hallo,

    Natürlich funktioniert auch das ;)
    Hier der Code um den Checkstatus in eine Textdatei schreiben: (der Code wird so in die Textdatei geschrieben NamederCheckBox,True/False)
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sw As New StreamWriter("DeineDatei")
    2. For Each c As Control In Me.Controls
    3. If TypeOf c Is CheckBox Then
    4. Dim checkbox As CheckBox = DirectCast(c, CheckBox)
    5. Dim check As Boolean = checkbox.Checked
    6. sw.WriteLine("{0},{1}", checkbox.Text, checkbox.Checked)
    7. End If
    8. Next
    9. sw.Close()

    Kurzer Hinweis: Nun werden alle CheckBoxes auf der Form, die in keinem Container sind in eine Textdatei geschrieben. Falls du die Checkboxes in einer GroupBox hast, ändert sich die erste Zeile des Codes statt Me.Controls zu Me.GroupBox1.Controls

    Nun das Einlesen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim sr As New StreamReader("DeineDatei")
    2. 'Alle Controls deselektieren
    3. For Each c As Control In Me.Controls
    4. If TypeOf c Is CheckBox Then
    5. DirectCast(c, CheckBox).Checked = False
    6. End If
    7. Next
    8. 'Alle Zeilen der Textdatei in ein List(Of String) packen
    9. Dim lines As New List(Of String)
    10. Do Until sr.Peek = -1
    11. lines.Add(sr.ReadLine)
    12. Loop
    13. 'Die Werte aus der Textdatei den Checkboxen zuteilen
    14. For Each item As String In lines
    15. For Each c As Control In Me.Controls
    16. If TypeOf c Is CheckBox Then
    17. Dim s() As String = Split(item, ",")
    18. If s(1) = "True" Then
    19. If DirectCast(c, CheckBox).Text = s(0) Then
    20. DirectCast(c, CheckBox).Checked = True
    21. End If
    22. End If
    23. End If
    24. Next
    25. Next
    26. sr.Close()

    Hier gilt das gleiche, wie ich oben erwähnt habe. Es wird wieder nur auf die Checkboxen auf der Form zugegriffen, nicht auf die in Containern. Falls die Checkboxen sich in Containern befinden wieder statt Me.Controls eben Me.NamedesContainers.Controls.

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom

    ijokur schrieb:

    If s(1) = "True"Then System.IndexOutOfRangeException wurde nicht behandelt

    Was heißt denn das überhaupt? Es heißt, dass der Index 1 für s zu hoch ist. Was folgt daraus? Das bedeutet es wurde nichts gesplittet. Wenn nichts gesplittet wurde, beinhaltet die Zeile das angegebene Trennzeichen nicht (in diesem Fall ein Beistrich). Daraus schließe ich, dass du von mir nur die Einlese-Funktion verwendetst und deine Version, um in die Textdatei zu schreiben. Darum in der Textdatei keine Beistriche -> nichts wird gesplittet -> Fehler

    Entweder du nimmst genau meinen Code (mit dem funktionierts zumindest bei mir) oder du passt das Trennzeichen an. Wenn du zwischen dem Checkbox Namen und dem CheckStatus ein Leerzeichen haben willst, ändert sich eine Zeile im Schreib-Code:

    VB.NET-Quellcode

    1. sw.WriteLine("{0} {1}", checkbox.Text, checkbox.Checked)

    und eine Zeile im Einlese-Code:

    VB.NET-Quellcode

    1. Dim s() As String = Split(item, " ")

    Ansonsten bleibt der Code gleich, wie in meinem vorherigen Post.

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom
    hi

    ich hab die Tage etwas keine zeit gehabt um weiter am meiner Anwendung zur Arbeiten.

    aber Dank Switcherlapp97 bin ich etwas weiter gekommen. Er hat mir Code bereitgestellt wo mehrere Checkboxen die sich im TableLayoutPanel1 Containers befinden sehe Post Nr.11 es Funktioniert wunderbar, leider habe ich nicht mittgeteilt das meine Checkboxen nicht CheckBox1 usw. heißen die sind mit Gruppennamen benannt. Als Ergebnis habe ich immer ja oder nein / True oder False gehabt. dass kommt davon weil meine Checkboxen werden checkend /ja oder uncheckend/ nein als Text
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub CheckBox1_CheckStateChanged(ByVal sender As System.Object, _
    2. ByVal e As System.EventArgs) Handles CheckBox1.CheckStateChanged
    3. If CheckBox1.Checked = True Then
    4. CheckBox1.Text = "ja" Else
    5. CheckBox1.Text = "nein"
    6. End If
    7. End Sub
    8. Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
    9. Select Case CheckBox1.CheckState
    10. Case CheckState.Unchecked CheckBox1.Text = "nein"
    11. Case CheckState.Checked CheckBox1.Text = "ja"
    12. Case CheckState.Indeterminate CheckBox1.Text = "nicht ausgewählt"
    13. End Select
    14. End Sub


    damit es bei mir Funktioniert habe ich seine Code verändert

    von checkbox.Text auf checkbox.Name

    jetzt werden meine Checkboxen entsprechend in einer Textdatei geschrieben und auch gelesen aber ich bekomme nach wie vor diese Fehler Meldung

    If s(1) = "True"Then System.IndexOutOfRangeException wurde nicht behandelt

    die kommt dann wenn ich Einlesen will.

    In dem Code sind noch fertig Codes aus Post Nr. 8

    wenn ich die Auskommandiere dann werden meine Checkboxen bei einlesen gecheckt markiert.

    Kann ich diesen IndexOutOfRangeException ändern??



    noch einmal ein Dankeschön an Switcherlapp97
    @ijokur

    Vermutlich hast du für deine vielen Checkboxen jedes mal den CheckboxChanged-Event neu geschrieben. Der folgende Code ist eine Möglichkeit, aber keine sonderlich elegante ... :P

    Code im Load-Event der Form:

    VB.NET-Quellcode

    1. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    2. For Each c As Control In TableLayoutPanel1.Controls
    3. If TypeOf c Is CheckBox Then
    4. AddHandler DirectCast(c, CheckBox).CheckedChanged, AddressOf CheckedChanged
    5. End If
    6. Next
    7. End Sub

    Du brauchst noch einen CheckedChanged-Sub damit das auch funktioniert:

    VB.NET-Quellcode

    1. Private Sub CheckedChanged(sender As Object, e As System.EventArgs)
    2. For Each c As Control In TableLayoutPanel1.Controls
    3. If TypeOf c Is CheckBox Then
    4. ChangeCheckBoxText(DirectCast(c, CheckBox))
    5. End If
    6. Next
    7. End Sub

    Ein paar Kommentare:
    - ein Problem ist es, dass wenn mehrere Checkboxen die gleichen Events haben, der Event nicht genau weiß welche Checkbox diesen Event auslöst
    - deshalb wird, wenn bei einer Checkbox der Checkstatus verändert wird bei allen Checkboxen der Checkstatus überprüft und der Checkbox-Text angepasst
    - wenn es nicht soo viele Checkboxen sind, ist das kein Problem, bei vielen, kann es schon eine kurze Wartezeit verursachen

    Würde mich übrigens auch interessieren, ob es da noch eine bessere Möglichkeit gibt :)

    Der IndexOutOfRange-Fehler kann übrigens nur auftreten, wenn du eine leere Textdatei einliest oder die Zeilen in der Textdatei keine Beistriche enthalten

    Gruß
    Switcherlapp97
    RubiksCubeSolver


    Jetzt im Showroom