WinForms variable RadioButtons in GroupBox - wie gehts richtig ?

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von 3D_CAD.

    WinForms variable RadioButtons in GroupBox - wie gehts richtig ?

    Hallo zusammen,

    für ein CAD-Programm habe ich in einem VB.net Derivat (iLogic) einen Produktkonfigurator erstellt. Die Eingabemaske möchte ich nun zusätzlich in VB.net mittels WinForm umsetzen. Ziel ist es, dass andere Abteilungen Zugriff auf die Produktlogik erhalten, direkt sehen können welche Kombinationen möglich sind und im Idealfall eine Parameterausgabe zur Weitergabe erhalten welche ich gerne im CAD einlesen würde.

    Momentan geht es mir erstmal um die reine Umsetzung der Eingabemaske mit abhängigen Auswahloptionen, welche bedingt durch die Auswahl anderer Option zur Verfügung stehen sollen.

    Eine erste Machbarkeitsversion habe ich mir zurechtgewurschtelt :whistling: und wollte nun, bevor ich die komplexeren Zusammenhänge einbringe, fragen ob sich jemand erbarmt über mein Machwerk einmal drüber zu schauen. Ich kann mir vorstellen dass dort einiges an Verbesserungspotential schlummert oder es komplett falsch aufgezogen ist. Vor allem da dies ein einfacherer Konfigurator ist und einer mit wesentlich mehr Abhängigkeiten umgesetzt werden soll.

    Einmal der Code und einmal das vollständige Abhängikeitsmodell.

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Imports Microsoft.VisualBasic.ControlChars
    4. Public Class Form1
    5. Private Sub Konfigurator_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    6. Call InitializeForm()
    7. End Sub
    8. #Region "Deklaration"
    9. Dim _Breite As String
    10. Dim _Version As String
    11. Dim _Anzahl As String
    12. Dim _Tiefe As String
    13. Private Const x01RadioButtons As Integer = 10
    14. Private Const y01RadioButtons As Integer = 20
    15. Private Const dyRadioButtons As Integer = 20
    16. Private rtb_Ausgabe As RichTextBox
    17. Private grb_Breite As GroupBox
    18. Private rb_Breite01 As RadioButton
    19. Private rb_Breite02 As RadioButton
    20. Private rb_Breite03 As RadioButton
    21. Private rb_Breite04 As RadioButton
    22. Private grb_Version As GroupBox
    23. Private rb_Version01 As RadioButton
    24. Private rb_Version02 As RadioButton
    25. Private grb_Tiefe As GroupBox
    26. Private rb_Tiefe01 As RadioButton
    27. Private rb_Tiefe02 As RadioButton
    28. Private rb_Tiefe03 As RadioButton
    29. Private rb_Tiefe04 As RadioButton
    30. Private rb_Tiefe05 As RadioButton
    31. Private rb_Tiefe06 As RadioButton
    32. Private grb_Anzahl As GroupBox
    33. Private rb_Anzahl06 As RadioButton
    34. Private rb_Anzahl07 As RadioButton
    35. Private rb_Anzahl08 As RadioButton
    36. Private rb_Anzahl09 As RadioButton
    37. Private rb_Anzahl10 As RadioButton
    38. Private rb_Anzahl11 As RadioButton
    39. Private rb_Anzahl12 As RadioButton
    40. #End Region
    41. Private Sub InitializeForm()
    42. grb_Breite = New System.Windows.Forms.GroupBox()
    43. rb_Breite01 = New System.Windows.Forms.RadioButton()
    44. rb_Breite02 = New System.Windows.Forms.RadioButton()
    45. rb_Breite03 = New System.Windows.Forms.RadioButton()
    46. rb_Breite04 = New System.Windows.Forms.RadioButton()
    47. grb_Version = New System.Windows.Forms.GroupBox()
    48. rb_Version01 = New System.Windows.Forms.RadioButton()
    49. rb_Version02 = New System.Windows.Forms.RadioButton()
    50. grb_Tiefe = New System.Windows.Forms.GroupBox()
    51. rtb_Ausgabe = New System.Windows.Forms.RichTextBox()
    52. Call FixeElemente()
    53. Call FixeAuswahl()
    54. Call VariableAuswahl()
    55. Call KonfiguratorForm()
    56. End Sub
    57. Private Sub FixeElemente()
    58. With rtb_Ausgabe
    59. .Location = New System.Drawing.Point(140, 17)
    60. .Name = "rtb_Ausgabe"
    61. .Size = New System.Drawing.Size(150, 200)
    62. .TabIndex = 7
    63. .Text = "Zusammenfassung"
    64. .ReadOnly = True
    65. End With
    66. End Sub
    67. Private Sub VariableAuswahl()
    68. Call AnzahlOptionen()
    69. Call TiefenOptionen()
    70. End Sub
    71. Private Sub FixeAuswahl()
    72. Call BreitenOptionen()
    73. Call VersionsOptionen()
    74. End Sub
    75. Private Sub BreitenOptionen()
    76. Dim IndexRadioButtons As Integer
    77. Dim y As Integer
    78. With grb_Breite
    79. .Location = New System.Drawing.Point(10, 10)
    80. .Size = New System.Drawing.Size(100, 105)
    81. .Text = "Breite"
    82. .Controls.Add(rb_Breite01)
    83. .Controls.Add(rb_Breite02)
    84. .Controls.Add(rb_Breite03)
    85. .Controls.Add(rb_Breite04)
    86. End With
    87. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    88. With rb_Breite01
    89. .Location = New System.Drawing.Point(x01RadioButtons, y)
    90. .Name = "rb_Breite01"
    91. .Size = New System.Drawing.Size(67, 17)
    92. .Text = "Breite 01"
    93. AddHandler .CheckedChanged, AddressOf BreiteChanged
    94. End With
    95. IndexRadioButtons += 1
    96. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    97. With rb_Breite02
    98. .Location = New System.Drawing.Point(x01RadioButtons, y)
    99. .Name = "rb_Breite02"
    100. .Size = New System.Drawing.Size(67, 17)
    101. .Text = "Breite 02"
    102. AddHandler .CheckedChanged, AddressOf BreiteChanged
    103. End With
    104. IndexRadioButtons += 1
    105. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    106. With rb_Breite03
    107. .Location = New System.Drawing.Point(x01RadioButtons, y)
    108. .Name = "rb_Breite03"
    109. .Size = New System.Drawing.Size(67, 17)
    110. .Text = "Breite 03"
    111. AddHandler .CheckedChanged, AddressOf BreiteChanged
    112. End With
    113. IndexRadioButtons += 1
    114. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    115. With rb_Breite04
    116. .Location = New System.Drawing.Point(x01RadioButtons, y)
    117. .Name = "rb_Breite04"
    118. .Size = New System.Drawing.Size(67, 17)
    119. .Text = "Breite 04"
    120. AddHandler .CheckedChanged, AddressOf BreiteChanged
    121. End With
    122. End Sub
    123. Private Sub VersionsOptionen()
    124. Dim IndexRadioButtons As Integer
    125. Dim y As Integer
    126. With grb_Version
    127. .Location = New System.Drawing.Point(10, 120)
    128. .Size = New System.Drawing.Size(100, 65)
    129. .Text = "Version"
    130. .Controls.Add(rb_Version01)
    131. .Controls.Add(rb_Version02)
    132. End With
    133. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    134. With rb_Version01
    135. .Location = New System.Drawing.Point(x01RadioButtons, y)
    136. .Name = "rb_Version01"
    137. .Size = New System.Drawing.Size(75, 17)
    138. .Text = "Standard"
    139. AddHandler .Click, AddressOf VersionChanged
    140. End With
    141. IndexRadioButtons += 1
    142. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    143. With rb_Version02
    144. .Location = New System.Drawing.Point(x01RadioButtons, y)
    145. .Name = "rb_Version02"
    146. .Size = New System.Drawing.Size(75, 17)
    147. .Text = "Hoch"
    148. AddHandler .Click, AddressOf VersionChanged
    149. End With
    150. End Sub
    151. Private Sub TiefenOptionen()
    152. Dim IndexRadioButtons, y As Integer
    153. rb_Tiefe01 = New System.Windows.Forms.RadioButton()
    154. rb_Tiefe02 = New System.Windows.Forms.RadioButton()
    155. rb_Tiefe03 = New System.Windows.Forms.RadioButton()
    156. rb_Tiefe04 = New System.Windows.Forms.RadioButton()
    157. rb_Tiefe05 = New System.Windows.Forms.RadioButton()
    158. rb_Tiefe06 = New System.Windows.Forms.RadioButton()
    159. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    160. With rb_Tiefe01
    161. .Location = New System.Drawing.Point(x01RadioButtons, y)
    162. .Name = "rb_Tiefe01"
    163. .Size = New System.Drawing.Size(67, 17)
    164. .Text = "Tiefe 01"
    165. AddHandler .CheckedChanged, AddressOf TiefeChanged
    166. End With
    167. With rb_Tiefe03
    168. .Location = New System.Drawing.Point(x01RadioButtons, y)
    169. .Name = "rb_Tiefe03"
    170. .Size = New System.Drawing.Size(67, 17)
    171. .Text = "Tiefe 03"
    172. AddHandler .CheckedChanged, AddressOf TiefeChanged
    173. End With
    174. With rb_Tiefe05
    175. .Location = New System.Drawing.Point(x01RadioButtons, y)
    176. .Name = "rb_Tiefe05"
    177. .Size = New System.Drawing.Size(67, 17)
    178. .Text = "Tiefe 05"
    179. AddHandler .CheckedChanged, AddressOf TiefeChanged
    180. End With
    181. IndexRadioButtons += 1
    182. y = y01RadioButtons + IndexRadioButtons * dyRadioButtons
    183. With rb_Tiefe02
    184. .Location = New System.Drawing.Point(x01RadioButtons, y)
    185. .Name = "rb_Tiefe02"
    186. .Size = New System.Drawing.Size(67, 17)
    187. .Text = "Tiefe 02"
    188. AddHandler .CheckedChanged, AddressOf TiefeChanged
    189. End With
    190. With rb_Tiefe04
    191. .Location = New System.Drawing.Point(x01RadioButtons, y)
    192. .Name = "rb_Tiefe04"
    193. .Size = New System.Drawing.Size(67, 17)
    194. .Text = "Tiefe 04"
    195. AddHandler .CheckedChanged, AddressOf TiefeChanged
    196. End With
    197. With rb_Tiefe06
    198. .Location = New System.Drawing.Point(x01RadioButtons, y)
    199. .Name = "rb_Tiefe06"
    200. .Size = New System.Drawing.Size(67, 17)
    201. .Text = "Tiefe 06"
    202. AddHandler rb_Tiefe06.CheckedChanged, AddressOf TiefeChanged
    203. End With
    204. Select Case _Breite
    205. Case "Breite 01"
    206. SetTiefenOptionen({rb_Tiefe01, rb_Tiefe02})
    207. If Not rb_Tiefe02.Checked Then rb_Tiefe01.Checked = True
    208. Case "Breite 02"
    209. SetTiefenOptionen({rb_Tiefe03, rb_Tiefe04})
    210. If Not rb_Tiefe04.Checked Then rb_Tiefe03.Checked = True
    211. Case "Breite 03"
    212. SetTiefenOptionen({rb_Tiefe01, rb_Tiefe02})
    213. If Not rb_Tiefe02.Checked Then rb_Tiefe01.Checked = True
    214. Case "Breite 04"
    215. SetTiefenOptionen({rb_Tiefe05, rb_Tiefe06})
    216. If Not rb_Tiefe06.Checked Then rb_Tiefe05.Checked = True
    217. Case Else
    218. SetTiefenOptionen({rb_Tiefe01, rb_Tiefe02})
    219. End Select
    220. Controls.Add(grb_Tiefe)
    221. End Sub
    222. Private Sub SetTiefenOptionen(BtnsToAdd() As RadioButton)
    223. grb_Tiefe.AutoSize = False
    224. grb_Tiefe.Controls.Clear()
    225. For i As Integer = 1 To BtnsToAdd.GetUpperBound(0) + 1
    226. grb_Tiefe.Controls.Add(BtnsToAdd(i - 1))
    227. Next
    228. With grb_Tiefe
    229. .Location = New System.Drawing.Point(10, 190)
    230. .Size = New System.Drawing.Size(100, 65)
    231. .Name = "grb_Tiefe"
    232. .Text = "Tiefe"
    233. End With
    234. End Sub
    235. Private Sub AnzahlOptionen()
    236. End Sub
    237. Private Sub KonfiguratorForm()
    238. ClientSize = New System.Drawing.Size(310, 410)
    239. Controls.Add(grb_Breite)
    240. Controls.Add(grb_Version)
    241. Controls.Add(grb_Tiefe)
    242. Controls.Add(rtb_Ausgabe)
    243. End Sub
    244. Private Sub BreiteChanged(ByVal sender As Object, ByVal e As EventArgs)
    245. If rb_Breite01.Checked Then
    246. _Breite = "Breite 01"
    247. ElseIf rb_Breite02.Checked Then
    248. _Breite = "Breite 02"
    249. ElseIf rb_Breite03.Checked Then
    250. _Breite = "Breite 03"
    251. ElseIf rb_Breite04.Checked Then
    252. _Breite = "Breite 04"
    253. End If
    254. Call TiefenOptionen()
    255. Call Ausgabe()
    256. End Sub
    257. Private Sub VersionChanged(ByVal sender As Object, ByVal e As EventArgs)
    258. If rb_Version01.Checked Then
    259. _Version = "Standard"
    260. ElseIf rb_Version02.Checked Then
    261. _Version = "Hoch"
    262. End If
    263. Call Ausgabe()
    264. End Sub
    265. Private Sub TiefeChanged(ByVal sender As Object, ByVal e As EventArgs)
    266. If rb_Tiefe01.Checked Then
    267. _Tiefe = "Tiefe 01"
    268. ElseIf rb_Tiefe02.Checked Then
    269. _Tiefe = "Tiefe 02"
    270. ElseIf rb_Tiefe03.Checked Then
    271. _Tiefe = "Tiefe 03"
    272. ElseIf rb_Tiefe04.Checked Then
    273. _Tiefe = "Tiefe 04"
    274. ElseIf rb_Tiefe05.Checked Then
    275. _Tiefe = "Tiefe 05"
    276. ElseIf rb_Tiefe06.Checked Then
    277. _Tiefe = "Tiefe 06"
    278. Else
    279. _Tiefe = " "
    280. End If
    281. Call Ausgabe()
    282. End Sub
    283. Private Sub Ausgabe()
    284. Const unitLength As String = " mm"
    285. Const unitArea As String = " m²"
    286. Const unitUnitless As String = " "
    287. Const unitLengthTc As String = "[mm]"
    288. Const unitAreaTc As String = "[m²]"
    289. Const unitUnitlessTc As String = "[-] "
    290. rtb_Ausgabe.Text = "Zusammenfassung" & Lf & Lf &
    291. "Breite:" & Tab & _Breite & unitLength & Lf &
    292. "Version:" & Tab & _Version & Lf &
    293. "Tiefe:" & Tab & _Tiefe & unitLength
    294. End Sub
    295. End Class



    Jetzt schon einmal vielen Dank für eure Mühen


    Grüße

    3D_CAD
    Bilder
    • Entwurf_Konfigurator_01.png

      57,17 kB, 687×1.348, 76 mal angesehen
    So, drübergeschaut hab ich.
    Aber ausprobieren kann ich nix, und bei > 30 Zeilen kann man bei drüberschauen allenfalls sagen: "jo, sieht hübsch aus".
    Also wirklich drüberschauen könnte ich nur, wenn du eine lauffähige Solution zippst und anhängst - nur die Sources, Binaries bitte entfernen.

    Und von iLogic habich noch nie gehört, und mag ich mir auch nicht installieren - also deine Solution müsste ohne das lauffähig sein.
    Der Code lässt sich direkt in das Form1.vb eines neuen WinForms Projekt setzen und ist dann lauffähig.

    Mit iLogic hat der Code / das Ganze nichts weiter zu tun, war nur Tei meiner ausschweifenden Erläuterung.

    Anbei die hoffentlich lauffähige Solution
    Dateien
    Jo, für mich sieht das sehr abwegig aus. Ich würde das als typisiertes Dataset modellieren, mit den Tabellen Breite, Version, Tiefe.
    Zur Auswähl kämen Listboxen, Comboboxen oder Datagridview zum Einsatz.

    Wäre ein kompletter Rewrite, aber (für mich) ziemlich einfach.

    Dann wäre das Teil auf einer erprobten Technologie aufgebaut und exorbitant Ausmass erweiterbar.
    Hingegen wies derzeit ist, kommt man mittm Verständnis bereits jetzt an Grenzen - hab ich den Eindruck.
    Und ob das korrekt funktioniert?

    Etwa wenn ich Breite 01 eingestellt hab, dann stellt sich Tiefe 01 ein.
    Dann wechsel ich auf Tiefe 02.
    Wenn ich dann auf Breite 02 gehe, und danach auf Breite 01 zurückkehre - dann ist Tiefe wieder Tiefe 01 (wo ich vorher doch Tiefe 02 eingestellt hab).
    Ist das beabsichtigt?
    @3D_CAD Ich würde die RadioButton alle im Designer anlegen, dann brauchst Du nur 8 Stück.
    Neben der Umbenennung würde ich Dir die Property .Tag empfehlen, um beim Klicksen zu wissen, welche Kennung dahinter steckt.
    Was ist der Unterschied zwischen Breite 01 und Breite 03? Wenn bei diesen dieselben Tiefen angeboten werden, sollten sie untereinander stehen.
    @ErfinderDesRades Jou, die innere Logik erschließt sich mir nicht.
    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!
    Danke fürs anschauen.


    ... Ich würde das als typisiertes Dataset modellieren ...


    Das übersteigt leider meine derzeitigen (Un)Kenntnisse :huh:

    Prinzipiell funktioniert das bisher korrekt.

    Das CAD-seitige Formular habe ich in iLogic umgesetzt. Das ist eine eigene Implemtierung von Autodesk ins CAD-Programm zur Steuerung von Modellen etc. mit Syntax VB.net und einigen spezifischen Funktionen u.a. in der Verwendung innerhalb von Fomularen (Comboboxen lassen sich dort z.B. als Optionsfeldgruppe darstellen, was optisch meinen RadioButton-Gruppen entspricht). Dort passt alles und meine bisherige Umsetzung in WinForms verhält sich auch wie gewünscht.

    Tatsächlich wäre der Einsatz von Comboboxen auch meine erste Wahl und würde alles viel leichter machen, allerdings wünsche ich ein optische Durchgängigkeit, mit gleichzeitiger Ansicht aller wählbaren Optionen

    z.B. beim Wechsel Breite01 -> Breite02 steht weder die Option Tiefe01 noch Tiefe02 zur Verfügung. Daher wechselt er auf Tiefe03 als Standard Auswahl.

    Edit01:
    @ErfinderDesRades

    ... Wenn ich dann auf Breite 02 gehe, und danach auf Breite 01 zurückkehre - dann ist Tiefe wieder Tiefe 01 (wo ich vorher doch Tiefe 02 eingestellt hab).

    Ist das beabsichtigt? ...

    Sorry, falsch verstanden. Nein prinzipiell könnte auch die vorherige Auswahl dort drin stehen, allerdings Erstelle ich die RadioButtons momentan bei jeder einflussnehmenden Änderung neu. Zudem frage ich .Checked ab um einen Parameter zu setzen. Daher bin ich im Moment gezwungen zu resetten (sonst bliebe in der Ausgabe der Ursprünglich gesetzte Parameter stehen.


    @RodFromGermany

    ...Was ist der Unterschied zwischen Breite 01 und Breite 03? Wenn bei diesen dieselben Tiefen angeboten werden, sollten sie untereinander stehen. ...

    Es handelt sich um einen produktzentrischen Konfigurator. Die Logik des Produktaufbaus gibt vor das Breite 1 - 4 untereinander stehen.



    ... Ich würde die RadioButton alle im Designer anlegen, dann brauchst Du nur 8 Stück ...

    Ich habe den Fall, dass je nach Optionswahl eine unterschiedliche Anzahl an Radiobuttons benötigt werden. Siehe auch das Logikmodell oben. Ich habe noch mal eine um die Option Anzahl erweiterte Variante angehängt. Dort wird das Verhalten ersichtlich.
    Dateien

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „3D_CAD“ ()