Mehrfaches bearbeiten der Checkbox einträge

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

Es gibt 48 Antworten in diesem Thema. Der letzte Beitrag () ist von TheDoctorWho.

    VB.NET-Quellcode

    1. Dim CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    2. Dim Zähler As Integer = -1
    3. Using Sr As New IO.StreamReader("prglst.mcs")
    4. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None)
    5. For Each Line In Lines
    6. Zähler = Zähler + 1
    7. Dim Part() = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries)
    8. CheckBoxArray(Zähler).Text = Part(0)
    9. Next
    10. Sr.Close()
    11. End Using


    So sieht nun mein funktionierenes Script aus :)

    Das was jetzt noch ist , das ich 11 Checkboxes von (1-11) habe , und meine liste hat 11 Zeilen.
    Aber es wird mir ein zeilen überlauf angezeigt

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

    Setz doch mal eine BreakPoint bei Zeile 7 und schau nach, ob du tatsächlich nur 11 Zeilen einliest. Wenn du den Cursor über Lines bewegst, dann siehst du ja wieviele Zeilen enthalten sind. Vermutlich liest er am Ende der Datei noch eine leere Zeile ein weil du einen Zielenumbruch am Ende von Zeile 11 hast. Das wäre die häufigste Fehlerursache. Alternativ kannst du das natürlich auch begrenzen indem du Zeile 9 in eine If-Klausel setzt.

    VB.NET-Quellcode

    1. If Zähler >= 0 andalso Zähler <= 9 Then
    2. CheckBoxArray(Zähler).Text = Part(0)
    3. End If


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    @TheDoctorWho: Glückwunsch! Sieht so aus, als hättest du dein Problem auch ohne unsere Hilfe lösen können.
    Wo man die Lösung sieht, kann man auch erkennen, was du eiglich wolltest.
    Der Grund, warum wir nichts beitragen konnten, war: du konntest dein Problem garnicht formulieren.
    Und wir konnten dir auch nicht helfen, es klar zu formulieren, und ich verkneife es mir auch jetzt, es einfach vorzusagen.
    Könntest du jetzt - im Nachhinein - sagen, was das Problem war, was du gelöst hast?
    Ihr habt mir schon geholfen, auch wenn ihr am Thema vorbei geredet hattet :) was wohl ein stück an mir lag.

    Das Problem war das aud einer datei informationen in als Text in mehrere Checkboxen eingelesen werden sollte
    dazu der zweite teil als Globale variable

    Aber ich habe es verstanden nun die nächste dazu passende frage

    wie kann ich DIM Checkboxarray .... als globale variable setzen ohne es als read olny zu machen ?

    bzw den Array Checkboxarray(zähler) in anderen subrutienen zu nutzen

    Beispiel:

    VB.NET-Quellcode

    1. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    2. For Zähler = 0 To 11
    3. If checkboxarray(Zähler).checked = 0 Then
    4. End If
    5. WC.DownloadFileAsync(New Uri(Dat(Zähler)), "C:\softdown\" + String.Format(Zähler).exe) ' ich weis das diese zeile nicht funktioniert
    6. Next
    7. End Sub

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „TheDoctorWho“ ()

    Du lässt einfach das ReadOnly weg?
    Was verstehst Du unter globale Variable? Wo soll das CheckBoxArray bekannt sein? Methodenweit? Form-klassenweit? Projektweit? Solutionweit? PC-weit? Netzwerkweit? Weltweit?

    TheDoctorWho schrieb:

    If checkboxarray(Zähler).checked = 0 Then
    :!: :?: Ich schreibe nichts mehr ohne den Option Strict On-Anwalt!
    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.
    Globale Variable sind für mich alle variabeln die man in Puplic Class Unterbringt:

    z.B:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Dat() As String
    3. Dim WithEvents WC As WebClient = New WebClient()
    4. Dim Teil() As String


    Dann lokale bzw private Variable die man in Private Sub unterbringt

    z.B.

    VB.NET-Quellcode

    1. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    3. Dim Zähler As Integer = -1


    Die privaten Variable kann man nur in der Privaten Sub benutzen, soe wie ich es verstehe
    die globalen sind SUB übergreiffend
    @TheDoctorWho Ich hab mir mal den Code aus Post #22 angesehen:

    VB.NET-Quellcode

    1. Dim CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    2. Dim lines() = System.IO.File.ReadAllLines("prglst.mcs")
    3. For Zähler = 0 To Math.Min(CheckBoxArray.Length, lines.Length) - 1
    4. Dim Part() = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries)
    5. CheckBoxArray(Zähler).Text = Part(0)
    6. 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!
    @TheDoctorWho

    wäre eine Checkedlistbox nicht eine bessere Wahl?
    hier ein Bsp.

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.IO
    3. Public Class Form1
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. SaveData("D:\TestFolder\TestSave.txt", CheckedListBox1)
    6. End Sub
    7. Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    8. CheckedListBox1.CheckOnClick = True
    9. 'Beispiel(Daten)
    10. For i = 8 To 17
    11. CheckedListBox1.Items.Add(Format(i, "00") & ":00")
    12. CheckedListBox1.Items.Add(Format(i, "00") & ":30")
    13. Next
    14. End Sub
    15. Public Sub SaveData(ByVal FileName As String, ByVal CListBox As CheckedListBox)
    16. Dim sb As New System.Text.StringBuilder
    17. For Index As Integer = 0 To CListBox.Items.Count - 1
    18. sb.AppendLine(String.Format("{0},{1}",
    19. If(CListBox.GetItemChecked(Index), True, False), CListBox.Items(Index)))
    20. Next
    21. IO.File.WriteAllText(FileName, sb.ToString)
    22. End Sub
    23. End Class
    @Kasi

    Die Idee mit der Listbox hatte ich auch, aber für den gesamt Zusammenhang des Programms , ist es nicht wirklich nützlich

    da noch Progressbar's benutzt werden sollen die entsprechend den Status anzeigen swollen wie weit das einzelne Programm eingerichtet ist .

    Vieleicht ist es besser ich zeig den gesamt Script

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports System.Net
    3. Public Class Form1
    4. Dim Datei() As String
    5. Dim WithEvents WC As WebClient = New WebClient()
    6. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. Dim CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    8. Dim Zähler As Integer = -1
    9. Using Sr As New IO.StreamReader("prglst.mcs")
    10. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None)
    11. For Each Line In Lines
    12. Zähler = Zähler + 1
    13. Dim Part() = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries)
    14. If Zähler < 11 Then
    15. CheckBoxArray(Zähler).Text = Part(0)
    16. End If
    17. Next
    18. Sr.Close()
    19. End Using
    20. AddHandler WC.DownloadProgressChanged, AddressOf WC_DownloadProgressChanged
    21. AddHandler WC.DownloadFileCompleted, AddressOf WC_DownloadFileCompleted
    22. End Sub
    23. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    24. For Zähler = 0 To 11
    25. 'If checkboxarray(Zähler).checked = 0 Then
    26. 'End If
    27. ' WC.DownloadFileAsync(New Uri(Dat(Zähler)), "C:\softdown\" + String.Format(Zähler))
    28. Next
    29. End Sub
    30. Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WC.DownloadProgressChanged
    31. ProgressBar2.Value = e.ProgressPercentage
    32. End Sub
    33. Private Sub WC_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WC.DownloadFileCompleted
    34. MsgBox("beendet", MsgBoxStyle.OkOnly)
    35. End Sub
    36. End Class


    Wie man sieht bin ich gerade an Private Sub button2 beschäftigtz da die Download routine durchgeführt wird wenn die checkboxes aktiviert sind
    Ich hoffe ja, wenn ich das richtig deute, das du bevor du die heruntergeladenen Setups oder Programme ausführt du überprüfst ob du da auch wirklich die richtigen Dateien hast.

    Nicht das da mal ein Server gehackt wird und die Viren ausführst.
    Grüße , xChRoNiKx

    Nützliche Links:
    Visual Studio Empfohlene Einstellungen | Try-Catch heißes Eisen
    Ich würde gern das thema mit meiner letzten Frage abschliessen

    Mein letztes problem ist das ich die Checkboxarray innerhalb einer SUB benutzen kann , doch die Nutzung bei anderen Subs soll ich es neu deklaieren.

    zur veranschauung:

    VB.NET-Quellcode

    1. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Dim CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    3. Dim Zähler As Integer = -1
    4. Using Sr As New IO.StreamReader("prglst.mcs")
    5. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None)
    6. For Each Line In Lines
    7. Zähler = Zähler + 1
    8. Dim Part() = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries)
    9. If Zähler < 11 Then
    10. CheckBoxArray(Zähler).Text = Part(0)
    11. End If


    wenn ich es den Checkboxarray in der class deklarien will so geht es nicht. Dort kann ich es nur als read olny machen ?

    also wie kann ich es den chackbox in mehren SUB's anwenden ?
    zb. um es später zu sehen welchen angehackt wurde und welches nicht ?
    Das gleiche mit dem Array Part()
    @TheDoctorWho Ganz einfach, probierma:

    VB.NET-Quellcode

    1. Private CheckBoxArray() As CheckBox
    2. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. CheckBoxArray = New CheckBox() {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    4. ' ...
    5. End Sub
    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!

    VB.NET-Quellcode

    1. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    2. Checkboxarray = New CheckBox {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    3. Dim Zähler As Integer = -1
    4. Using Sr As New IO.StreamReader("prglst.mcs")
    5. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None)
    6. For Each Line In Lines
    7. Zähler = Zähler + 1
    8. Datei = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries)
    9. If Zähler < 11 Then
    10. Checkboxarray(Zähler).Text = Part(0)
    11. End If
    12. Next
    13. Sr.Close()
    14. End Using


    Nun meldet der mir bei Zeile 10 ein Fehler,
    Die Klasse Checkbox kann nicht idenziert werden, da sie keine Standarteigenschaft hat

    TheDoctorWho schrieb:

    Checkboxarray = New CheckBox {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}

    Das ist doch totaler Blödsinn. Das kompiliert doch gar nicht. Und ist auch anders, als RfG in Post#35 geschrieben hat. Solange wir es mit unechtem Code zu tun haben, ist es ein Ding der Unmöglichkeit, hier vernünftig zu helfen.
    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.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim WithEvents WC As WebClient = New WebClient()
    3. Dim zähler As Integer
    4. Private CheckBoxArray(zähler) As CheckBox
    5. Private Datei() As String
    6. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    7. CheckBoxArray = New CheckBox() {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    8. zähler = -1
    9. Using Sr As New IO.StreamReader("prglst.mcs")
    10. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None)
    11. For Each Line In Lines
    12. zähler = zähler + 1
    13. Dim part() = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries)
    14. If zähler < 11 Then
    15. CheckBoxArray(zähler).Text = part(0)
    16. Datei(zähler) = part(1)
    17. End If
    18. Next
    19. Sr.Close()
    20. End Using
    21. AddHandler WC.DownloadProgressChanged, AddressOf WC_DownloadProgressChanged
    22. AddHandler WC.DownloadFileCompleted, AddressOf WC_DownloadFileCompleted
    23. End Sub
    24. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    25. For Zähler = 0 To 11
    26. If CheckBoxArray(zähler).Checked = True Then
    27. End If
    28. 'WC.DownloadFileAsync(New Uri(Dat(Zähler)), "C:\softdown\" + String.Format(Zähler))
    29. Next
    30. End Sub
    31. Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WC.DownloadProgressChanged
    32. ProgressBar2.Value = e.ProgressPercentage
    33. End Sub
    34. Private Sub WC_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WC.DownloadFileCompleted
    35. MsgBox("beendet", MsgBoxStyle.OkOnly)
    36. End Sub
    37. End Class


    So sieht momentan der gesamt code aus.

    Warum sollte der unecht sein ? Der ist alles andere als Professionel , ja ok aber nicht unecht

    Mometan hab ich aber eine andere meldung bekommen wenn ich das Programm ausführen möchte , die ich merkwürdig finde

    For Each Line In Lines

    VB.NET-Quellcode

    1. For Each Line In Lines
    2. zähler = zähler + 1
    3. Dim part() = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries)
    4. If zähler < 11 Then
    5. CheckBoxArray(zähler).Text = part(0)
    6. Datei(zähler) = part(1)
    7. End If
    8. Next

    Mitlerweile weis ich dases an diesen Befehl liegt Datei(zähler) = part(1)
    Das endif wird beim aufrufen als fehler angezeigt , mit der meldung Der Objektverweis wurde nicht auf eine Objektistanz zugewiesen




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

    VaporiZed schrieb:

    Das ist doch totaler Blödsinn. Das kompiliert doch gar nicht.
    Bei mir schon ... :D
    Der Fehler bezieht sich auf Part.
    Leider ist @TheDoctorWho nicht in der Lage, seinen eigenen Code abzuschreiben:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private CheckBoxArray() As CheckBox
    2. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    3. CheckBoxArray = New CheckBox() {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    4. Dim Zähler As Integer = -1
    5. Using Sr As New IO.StreamReader("prglst.mcs")
    6. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None)
    7. For Each Line In Lines
    8. Zähler = Zähler + 1
    9. Dim Part = Line.Split(New String() {";"}, StringSplitOptions.RemoveEmptyEntries) ' das hier
    10. If Zähler < 11 Then
    11. CheckBoxArray(Zähler).Text = Part(0)
    12. End If
    13. Next
    14. Sr.Close()
    15. End Using
    16. End Sub

    @TheDoctorWho Und ? Hast Du Deinen Fehler gefunden?
    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!

    RodFromGermany schrieb:

    Bei mir schon ...
    Das glaub ich kaum. Zwischen einer CheckBox (Checkboxarray = New CheckBox {...}, Post#36) und einem CheckBox-Array (Checkboxarray = New CheckBox () {...}, entsprechend Deinem Post) besteht ziemlich sicher auch bei Deiner VS-Version ein Unterschied.
    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.