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.

    Mehrfaches bearbeiten der Checkbox einträge

    Ich hänge weider an einem Problem, diesmal nur ne kleinigkeit denke ich

    ich möchte bei allen checkbox die ich habe den Text-Eigenschaft mit einer schleife eintragen.

    VB.NET-Quellcode

    1. Using myreader As New Microsoft.VisualBasic.FileIO.TextFieldParser("prglst.mcs")
    2. myreader.TextFieldType = FileIO.FieldType.Delimited
    3. myreader.SetDelimiters(";")
    4. While Not myreader.EndOfData
    5. Try
    6. flag = False
    7. currentRow = myreader.ReadFields()
    8. Dim currentField As String
    9. For Each currentField In currentRow
    10. If flag = False Then
    11. Zähler = Zähler + 1
    12. datei = currentField
    13. flag = True
    14. Else
    15. Me.CheckBox(Zähler).text = datei
    16. feld(Zähler) = currentField
    17. flag = False
    18. End If
    19. Next
    20. Catch ex As Microsoft.VisualBasic.
    21. FileIO.MalformedLineException
    22. MsgBox("Line " & ex.Message &
    23. "is not valid and will be skipped.")
    24. End Try
    25. End While
    26. End Using



    ich bitte hier um untertützung und wo ich den denkfehler habe ?

    P.S. ich weis es ist nicht die beste lösung eine datei einzulesen, aber dabei geht es hier auch nicht :)
    @TheDoctorWho Was passiert?
    Was passiert nicht?
    Was soll passieren?
    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!
    Vollzitat des direkten Vorposts an dieser Stelle entfernt ~VaporiZed

    es soll einfach beim Programstart eine txt-datei (als PRGLST.MCS) geladen werden
    und darin die einträge als Bezeichnung für die CheckBox benutzt werden.
    Wenn zu dem Checkbox kein Link in der Liste steht dann soll dieser disablelt werden.

    aber das mit dem Disablet hab ich noch nicht hier einbezogen

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

    Me.CheckBox(Zähler).text Das geht bei normalen CheckBoxen seit VB.NET nicht mehr. Das ging in VB6. Von daher: Ich das echter Code? Wenn ja, wie ist CheckBox deklariert?
    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.
    @VaporiZed An VB6 hab ich überhaupt nicht gedacht.
    @TheDoctorWho In welchem Zusammenhang stehen die CheckBoxen mit den Zeilen in der Text-Datei?
    Du kannst natürlich Deine CheckBoxen aus der GUI einem Array von ChecxkBoxen zuweisen und dann dürfte Dein Ansatz wieder funktionieren:

    VB.NET-Quellcode

    1. Dim CheckBoxArray() = { CheckBox1, CheckBox2, CheckBox3, CheckBox4 } ' ...
    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!
    So sind die 11 Check box deklariert , jeden checkbox einzeln von Checkbox1 - Checkbox11

    VB.NET-Quellcode

    1. Me.CheckBox1.AutoSize = True
    2. Me.CheckBox1.Location = New System.Drawing.Point(24, 25)
    3. Me.CheckBox1.Name = "CheckBox1"
    4. Me.CheckBox1.Size = New System.Drawing.Size(79, 17)
    5. Me.CheckBox1.TabIndex = 1
    6. Me.CheckBox1.Text = "Java 32 Bit"
    7. Me.CheckBox1.UseVisualStyleBackColor = True


    Ich weis mir fehlt viel zum programmieren, aber dieses Program was ich vorhabe zu machen ist für mich wichtig
    Mag ja sein, aber der Code Me.CheckBox(Zähler).text funktioniert nicht. Er kann (mit den derzeit gegebenen Infos) nicht kompilieren. Aber Post#1 suggeriert, dass es der Code ist, mit dem Du bereits arbeitest. Das kann aber aus genanntem Grund nicht sein. Daher die Nachfrage. Was ist nun Dein tatsächlich bisher verwendeter und funktionierender Code?
    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.

    TheDoctorWho schrieb:

    So sind die 11 Check box deklariert
    Da musst Du halt den Code aus Post #5 bis CheckBox11 fortsetzen.
    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!
    So schaut der Code gesamzt aus :

    wie gesagt geübter anfänger :)

    VB.NET-Quellcode

    1. Option Strict Off
    2. Imports System.Net
    3. Public Class Form1
    4. Dim currentRow As String()
    5. Dim WithEvents WC As WebClient = New WebClient()
    6. Dim Zeile As String
    7. Dim Zähler As Integer
    8. Dim Zeichen As Integer
    9. Dim Datei As String
    10. Dim Wert As String
    11. Dim txt As String
    12. ReadOnly CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    13. Private Sub FrmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    14. CheckBoxArray(10) = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}
    15. Using myreader As New Microsoft.VisualBasic.FileIO.TextFieldParser("prglst.mcs")
    16. myreader.TextFieldType = FileIO.FieldType.Delimited
    17. myreader.SetDelimiters(";")
    18. While Not myreader.EndOfData
    19. Try
    20. currentRow = myreader.ReadFields()
    21. Dim currentField As String
    22. For Each currentField In currentRow
    23. Zeile = currentField
    24. Zähler = Zähler + 1
    25. Zeichen = InStr(currentField, ";")
    26. 'Left(Zeile, Zeichen)
    27. Datei = Mid(Zeile, Zeichen + 1, (Len(Zeile) - 1))
    28. SetTextToCheckboxes(txt)
    29. Next
    30. Catch ex As Microsoft.VisualBasic.
    31. FileIO.MalformedLineException
    32. MsgBox("Line " & ex.Message &
    33. "is not valid and will be skipped.")
    34. End Try
    35. End While
    36. End Using
    37. AddHandler WC.DownloadProgressChanged, AddressOf WC_DownloadProgressChanged
    38. AddHandler WC.DownloadFileCompleted, AddressOf WC_DownloadFileCompleted
    39. End Sub
    40. Private Function Left(zeile As String, zeichen As Integer) As Integer
    41. Wert = Left(zeile, zeichen)
    42. End Function
    43. Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
    44. WC.DownloadFileAsync(New Uri("https://javadl.oracle.com/webapps/download/AutoDL?BundleId=242990_a4634525489241b9a9e1aa73d9e118e6"), "C:\softdown\java64.exe")
    45. End Sub
    46. Private Sub WC_DownloadProgressChanged(ByVal sender As Object, ByVal e As System.Net.DownloadProgressChangedEventArgs) Handles WC.DownloadProgressChanged
    47. ProgressBar2.Value = e.ProgressPercentage
    48. End Sub
    49. Private Sub WC_DownloadFileCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.AsyncCompletedEventArgs) Handles WC.DownloadFileCompleted
    50. MsgBox("beendet", MsgBoxStyle.OkOnly)
    51. End Sub
    52. Private Sub SetTextToCheckboxes(txt As String)
    53. Dim CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4}
    54. For Each cb In CheckBoxArray
    55. cb.Text = txt
    56. Next
    57. End Sub
    58. End Class
    Zeile#1 8|
    Damit verscherzt Du es Dir mit ganz vielen Lesern.

    Z#16, #62: hinfort damit! Das ist doch schon mit Z#13 abgehakt.

    Durch die Schleife um Z#33 rum werden doch die CheckBox-Inhalte zigmal überschrieben. Ist das Absicht?

    Z#48/49: Ist das ne Endlosschleife oder blick ich da was nicht?

    Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden.
    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.
    #1 wurde auf off gesetzt weil folgedes sonnst als fehler angezeigt wird : ReadOnly CheckBoxArray() = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}

    #16 und #62 gelöscht

    #32 genau da liegt das problem , es soll jeder check box (1-11) einen anderen Text (Bezeichnung) eingetragen werden.

    #48 und #49 soll eine Funktion sein die ein Left text ausliest ( aber da bin ich selber noch dran am schreiben ) also Dies bitte übersehen :)
    Zeile 1:
    Dein Ernst?

    VB.NET-Quellcode

    1. Private ReadOnly CheckBoxList As List(Of CheckBox) = {CheckBox1, CheckBox2, CheckBox3, CheckBox4, CheckBox5, CheckBox6, CheckBox7, CheckBox8, CheckBox9, CheckBox10, CheckBox11}.tolist

    'Und falls es irgendwas geben sollte, was ein Array kann und eine List(of T) nicht kann, dann machst du halt

    VB.NET-Quellcode

    1. CheckBoxList.ToArray


    Zeile 4:
    Benamung hilft.

    Zeile 5-12:
    Dim benutzt man nur in Methoden. Für Variablen innerhalb der Klasse existiert die Zugriffsebene Private

    Zeile 13:
    Siehe Kommentar zu Zeile 1.

    Zeile 16, 25,:
    Überflüsssig.

    Zeile 29:
    Deprecated Benutze stattdessen:

    VB.NET-Quellcode

    1. Zeichen = currentField.IndexOf(";")

    In Gegensatz zu InStr ist IndexOf 0-basiert und du kannst die den Mist mit -1 zwei Zeilen dadrunter sparen

    So das wars ermal zu äußeren Form, der Rest wären Wiederholungen. Kommen wir zur Architektur:

    Das hier ist dein Code bis Zeile 42 (Ich musste einige Sachen weglassen, weil ich echt nicht verstanden habe was du das vorhast):

    VB.NET-Quellcode

    1. Private Lines As List(Of String)
    2. Private FieldList As List(Of String)
    3. Private Sub Jahresansicht_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    4. Using Sr As New IO.StreamReader("prglst.mcs")
    5. Lines = Sr.ReadToEnd.Split(CChar(Environment.NewLine)).ToList
    6. For Each Line In Lines
    7. FieldList = Line.Split(CChar(";")).ToList
    8. 'Bis hierher verstehe ich ansatzweise was du vorhast, aber dann wird es so strange, dass ich kein Plan habe wie es weiter gehen soll.
    9. Next
    10. Sr.Close()
    11. End Using
    12. End Sub



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    @Yanbel: CChar() solltest du nicht verwenden, wenn du in Code einen Char formulieren willst.
    Wenn du einen String hast, verwende die Split-Überladung, die String akzeptiert (zeile #3).
    Wenn du einen Char formulieren willst, dann so, wie's in vb.net vorgesehen ist, einen Char zu formulieren (zeile #5)

    VB.NET-Quellcode

    1. vPrivate Sub Jahresansicht_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    2. Using Sr As New IO.StreamReader("prglst.mcs")
    3. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None) ' CChar(Environment.NewLine) wandelt (kürzt) den 2-char-String in 1 char, was zu höchst überraschendem Verhalten führen kann
    4. For Each Line In Lines
    5. Dim FieldList = Line.Split(";"c) ' so formuliert man in vb.net ein char-literal
    6. 'Bis hierher verstehe ich ansatzweise was du vorhast, aber dann wird es so strange, dass ich kein Plan habe wie es weiter gehen soll.
    7. Next
    8. Sr.Close()
    9. End Using
    10. End Sub




    @DoctorWho: Ich denke, du bist mit deinem Projekt überfordert, weil dir die grundlegendsten Grundlagen fehlen.
    Aus post#9 und post#10 sehe ich, dass du eben nicht weisst, wie man eine Sub aufruft.

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

    VB.NET-Quellcode

    1. Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None)

    Jop stimmt in Bezug auf Windows. Da hab ich gepennt, sorry.

    ";"c vs CChar(";")
    Macht keinen Unterschied. Etwas in Anführungszeichen zu setzen gibt standardmäßig einen String zurück. Ob ich dem Compiler jetzt mitteile, dass der String ein Char ist, wie in deinem Beispiel, oder aber die Conversion dazu aufrufe, die nichts anderes tut als das erste (und einzige) Zeichen aus dem String zu nehmen und als Char-Wert zurückzugeben, spielt keine Rolle, da String intern ein CharArray ist. Es ist also völlig egal ob ich ";"c oder CChar(";") (liefert intern ";"(0) oder vbNullChar zurück) schreibe, mit dem Unterschied das CChar auch ungetrimmte Strings verarbeitet, was bei "; "c bereits aufgrund der Syntax ausgeschlossen ist.
    Bilder
    • Überwachung.PNG

      3,39 kB, 1.583×63, 64 mal angesehen


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Mir ist bewusst das ich mit dem Programm überfordert bin, deswegen mache ich es ja um daraus zu lernen :)

    Es hat sich aber sehr viel verändert seit VB.net 2012

    Aber dennoch möchte ich die Software nicht nur fertig bekommen sondern auch folgende 3 Punkte verstehen.

    1. Checkbox, listbox usw als Array zu behandeln
    2. Download vom Datein ( das habe ich soweit verstanden)
    3 Installation von Programmen , wenn möglich im Hintergrund und unbeaufsichtigt ( mit der Installation habe ich auch bereits verstanden)

    Yanbel schrieb:

    CChar(";") vs ";"c
    Naja, CChar(";") ist eine Konvertierung von einem String in einen Char, und ";"c ist ein Char - keine Konvertierung.
    Ersteres verwenden Programmierer, die nicht wissen, wie man in vb.net ein Char-"Literal" (so das Fachwort) formuliert.

    In c# schreibt man ja auch nicht Convert.ToChar(";"), sondern man schreibt ';'

    Etwas in Anführungszeichen zu setzen gibt standardmäßig einen String zurück.
    Das ist eben falsch. Mit angehängtem c gibt das etwas in Anführungszeichen einen Char zurück - keinen String.

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

    VB.NET-Quellcode

    1. Using Sr As New IO.StreamReader("prglst.mcs")
    2. Dim Lines = Sr.ReadToEnd.Split({Environment.NewLine}, StringSplitOptions.None) ' CChar(Environment.NewLine) wandelt (kürzt) den 2-char-String in 1 char, was zu höchst überraschendem Verhalten führen kann
    3. For Each Line In Lines
    4. Dim FieldList = Line.Split(";"c) ' so formuliert man in vb.net ein char-literal
    5. 'Bis hierher verstehe ich ansatzweise was du vorhast, aber dann wird es so strange, dass ich kein Plan habe wie es weiter gehen soll.
    6. Next
    7. Sr.Close()
    8. End Using


    Das hat mir mit einem anderem problem geholfen, aber nun es geht mir eihgentlich nur darum das ich in 11 Checkbox'en mit einer schleife den ersten teil der eingelesenen zeile als text übernimmt
    also :

    checkbox.txt = eineglesenen 1.teil einer zeile, mit zwei begriffen die duch ein ";" getrennt sind

    beispielzeile : java64.exe;javadl.oracle.com/webapps/down…5489241b9a9e1aa73d9e118e6

    Dieses wird in chekcbox1 eingelesen in checkbox2 wird die nächste zeile eingelesen
    Ist schon richtig und in diesem Fall mit Sicherheit auch ein Anwendungsfall, bei dem du Recht hast. Aber in den meisten Fällen werden Chars aus String-Variablen übergeben, und spätestens da muss man zwangsläufig konvertieren. Ob ich nun generell konvertiere oder in diesen 5%-Ausnahmefällen den Wert als Char-Literal übergebe, ist denke ich so egal, dass es nicht einmal die Zeit für diese Diskussion wert ist. Es ist schön wenn jeder für sich auf solche Kleinigkeiten achtet, aber das in einem Forum zu diskutieren, dessen Inhalt sich in Hinblick auf Konvertierungen mit der wohl mit Abstand tolerantesten Programmiersprache überhaupt beschäftigt, erscheint mir wenig zielführend. Generell geb ich dir Recht, aber in der Praxis würde ich solche Kleinigkeiten nie korrigieren, selbst wenn sie mir irgendwo bewusst auffallen würden.

    Da fand ich deinen Einwand mit der fehlenden StringSplitOptions wesentlich berechtigter, denn dass hätte sich auf das Ergebnis ausgewirkt. Ich hatte erwartet, dass NewLine und Carriage Return ja nur jeweils einen Eintrag in der ASCII-Tabelle haben und dementsprechend auch nur ein Char-Literal als Pendant darsstellen. Aber da hast du mich kalt erwischt :D


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.