Fehlersuche: Bug bei Erstellung von Textboxen

  • VB.NET

Es gibt 7 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Fehlersuche: Bug bei Erstellung von Textboxen

    Wie oben geschrieben lasse ich mein Programm Textboxen erstellen.
    Insgesamt sollen es 10 Textboxen sein, da ich am Ende insgesamt 40 Textboxen haben möchte Teile ich die 40 Textboxen in 4 Gruppen ein.
    Durch zwei NumericUpDown's stelle ich die Gruppenanzahl und die Gesamtzahl der Textboxen ein die dann gleichmäsig (Gruppe1 hat immer wenn es ungerade ist mehr...) verteilt werden sollen und die restlichen Textboxen der Gruppe werden auf Enabled = False gestellt.

    Bug:

    Wenn ich jetzt zwei Gruppen einstelle und eine Gesamtzahl von 19 Textboxen dann sollte Gruppe 1 10 Textboxen haben die normal sind und in Gruppe 2 9 normale und 1 Enabled = False. Jedoch friert mein Programm ein hat jedoch schon in Gruppe 1 10 normale Textboxen erstellt und darunter auch 10 Enabled = False Textboxen.

    Mein Code:

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim ProTeam As Integer
    3. Dim PlusTeam As Integer
    4. Dim Gruppe1 As Integer
    5. Dim Gruppe2 As Integer
    6. Dim Gruppe3 As Integer
    7. Dim Gruppe4 As Integer
    8. Dim Gruppen As Integer
    9. Dim Mannschaften As Integer
    10. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    11. Dim counter As Integer
    12. 'entfernt vorhandene Textboxen
    13. Do Until counter = 10
    14. For Each ctrl As Control In Me.Controls
    15. If TypeOf ctrl Is TextBox Then
    16. Me.Controls.Remove(ctrl)
    17. ctrl = Nothing
    18. End If
    19. Next
    20. counter = counter + 1
    21. Loop
    22. Teams()
    23. TextBoxEnabled1()
    24. TextBoxEnabled2()
    25. 'TextBoxEnabled3()
    26. 'TextBoxEnabled4()
    27. End Sub
    28. Sub Teams()
    29. Gruppen = NumericUpDown5.Value
    30. Mannschaften = NumericUpDown1.Value 'Mannschaften = Anzahl der Textboxen die normal sind
    31. ProTeam = Mannschaften / Gruppen
    32. PlusTeam = Mannschaften Mod Gruppen
    33. If PlusTeam = 0 Then
    34. Gruppe1 = ProTeam
    35. Gruppe2 = ProTeam
    36. Gruppe3 = ProTeam
    37. Gruppe4 = ProTeam
    38. End If
    39. If PlusTeam = 1 Then
    40. Gruppe1 = ProTeam + 1
    41. Gruppe2 = ProTeam
    42. Gruppe3 = ProTeam
    43. Gruppe4 = ProTeam
    44. End If
    45. If PlusTeam = 2 Then
    46. Gruppe1 = ProTeam + 1
    47. Gruppe2 = ProTeam + 1
    48. Gruppe3 = ProTeam
    49. Gruppe4 = ProTeam
    50. End If
    51. If PlusTeam = 3 Then
    52. Gruppe1 = ProTeam + 1
    53. Gruppe2 = ProTeam + 1
    54. Gruppe3 = ProTeam + 1
    55. Gruppe4 = ProTeam
    56. End If
    57. End Sub
    58. Sub TextBoxEnabled1()
    59. Dim counter As Integer = 0
    60. Dim top As Integer = 38
    61. Do Until counter = Gruppe1
    62. Dim Textbox As New TextBox
    63. With Textbox
    64. .Text = ""
    65. .Name = "Textbox" & counter
    66. .Height = 20
    67. .Width = 157
    68. .Top = top
    69. .Left = 225
    70. .BackColor = Color.Yellow
    71. End With
    72. top = top + 26
    73. Me.Controls.Add(Textbox)
    74. counter = counter + 1
    75. Loop
    76. Do Until counter = 10
    77. Dim Textbox As New TextBox
    78. With Textbox
    79. .Text = ""
    80. .Name = "Textbox" & counter
    81. .Height = 20
    82. .Width = 157
    83. .Top = top
    84. .Left = 225
    85. .BackColor = Color.Gray
    86. .Enabled = False
    87. End With
    88. top = top + 26
    89. Me.Controls.Add(Textbox)
    90. counter = counter + 1
    91. Loop
    92. End Sub
    93. Sub TextBoxEnabled2()
    94. Dim counter As Integer
    95. Dim top As Integer = 38
    96. If Gruppen >= 2 Then
    97. Do Until counter = Gruppe2
    98. Dim Textbox As New TextBox
    99. With Textbox
    100. .Text = ""
    101. .Name = "Textbox" & (counter + 10)
    102. .Height = 20
    103. .Width = 157
    104. .Top = top
    105. .Left = 388
    106. .BackColor = Color.Green
    107. End With
    108. top = top + 26
    109. Me.Controls.Add(Textbox)
    110. counter = counter + 1
    111. Loop
    112. End If
    113. Do Until counter = 10
    114. Dim Textbox As New TextBox
    115. With Textbox
    116. .Text = ""
    117. .Name = "Textbox" & (counter + 10)
    118. .Height = 20
    119. .Width = 157
    120. .Top = top
    121. .Left = 388
    122. .BackColor = Color.Gray
    123. .Enabled = False
    124. End With
    125. top = top + 26
    126. Me.Controls.Add(Textbox)
    127. counter = counter + 1
    128. Loop
    129. End Sub
    130. Sub TextBoxEnabled3()
    131. 'kommt später auch noch
    132. End Sub
    133. Sub TextBoxEnabled4()
    134. 'kommt später auch noch
    135. End Sub
    136. End Class


    Vielen lieben Dann schonmal im Vorraus
    ich hoffe ihr versteht den Code

    gostman schrieb:

    VB.NET-Quellcode

    1. For Each ctrl As Control In Me.Controls
    2. If TypeOf ctrl Is TextBox Then
    3. Me.Controls.Remove(ctrl) ctrl = Nothing
    4. End If
    5. Next

    Funktioniert das ? oO

    Probier mal eher:

    VB.NET-Quellcode

    1. For Each ctrl As Control In Me.Controls.OfType(Of TextBox)() '...





    Und im Sub TextBoxEnabled1() setzt du counter nicht auf 0 zurück ^^
    »There's no need to "teach" atheism. It's the natural result of education without indoctrination.« — Ricky Gervais
    viele Controls erstellen ist zu 99% ein Holzweg.
    Weil im Grunde willst du nicht Textboxen verarbeiten, sondern Daten.

    Und zur Datenverarbeitung eignen sich die Tabellen im typisierten Dataset wesentlich besser.

    Anzeigen und editieren kann man die Daten dann in daran gebundenen Controls.

    guggemol Daten laden, speichern, verarbeiten

    gostman schrieb:

    VB.NET-Quellcode

    1. Do Until counter = 10
    VCor einer solchen Zeile solltest Du den counter jedesmal auf 0 setzen, sonst friert Dein Programm ein. :thumbup:
    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!
    Der Part mit
    Do Until counter = 10
    in TextBoxEnabled1 soll eigentlich weiterzählen von dem oberen damit wie auf den Bildern zu sehen ist die übrigen Textboxen nicht normal sind sondern auf Enabled = False ich habe jetzt eine if schleife für den unteren Part gemacht die nichts auslöst wenn counter = 10, ich habe immer noch das gleiche problem.

    Gibt es vielleicht eine andere Möglichkeit alle Textboxen in einer Schleife zu ändern habe gestern schon es mit Me.Controls und etwas anderem (ich finde leider nicht mehr was und wo es war) probiert und nur diese Möglichkeit hat funktioniert.

    habt ihr bei meinem Code die gleichen Bugs oder muss ich mal wieder das Projekt neu erstellen.

    gostman schrieb:

    soll eigentlich weiterzählen
    Dann sichere den Abbruch mit

    VB.NET-Quellcode

    1. Do Until counter >= 10
    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!

    Problem: Solved

    Vielen Dank RodFromGermany für die Hilfe.

    Jetzt werden die Textboxen richtig dargestellt habe aber bei beiden immer 10 Stück.
    Habe mir einfach mal alle Werte bei der Berechnung ausgeben lassen und anscheinend berechnet er bei 19 Mannschaften / 2 Gruppen nicht 9 r 1 sondern 10 r 1 was dann zu dem Bug geführt hat.

    Anscheinend hat er immer bei der berechnung aufgerundet. Ich lasse jetzt die Berechnung vor dem Speichern in ProTeam mit Fix() abrunden.

    Vielen Dank an ALLE die geholfen haben mein Problem zu lösen.

    gostman schrieb:

    mit Fix() abrunden
    Probier mal Integer-Division:

    VB.NET-Quellcode

    1. Dim value = 5 \ 3
    2. MessageBox.Show(value.ToString)
    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!