Fragen und "Probleme" mit GroupBox/RadioButton

  • C#
  • .NET (FX) 4.5–4.8

Es gibt 25 Antworten in diesem Thema. Der letzte Beitrag () ist von nafets.

    Fragen und "Probleme" mit GroupBox/RadioButton

    Hallo!Ich stehe gerade vor einem Problem wo ich mir selbst nicht mehr zu helfen weiß. Und zwar geht es um folgendes:
    ich habe zwei GroupBoxes mit jeweils 7 RadioButtons. Beide GB sind gleich aufgebaut.
    Wenn ich jetzt z.B. in GB1 RB1 auswähle, soll in GB2 der RB1 disabled werden, und/oder umgekehrt.
    Doofe Frage, aber wie kann man das machen? Mir ist klar wie ich z.B. den Namen des ausgewählten RB, oder auch aus beiden GB, ausgeben kann, aber wie übergebe ich den SelectedIndex an die jeweils andere GB?
    Und, muss ich dafür für alle 14 RB das CheckedChanged Event anlegen? Falls ja, kann man das ja ohne Probleme in einer Schleife machen, oder?

    Parmaster schrieb:

    Und, muss ich dafür für alle 14 RB das CheckedChanged Event anlegen?
    Das kannst du auch ohne Events erreichen...

    VB.NET-Quellcode

    1. Private Sub setOption(Value As Integer)
    2. GroupBox1.Controls.Cast(Of RadioButton)().First(Function(e) e.TabIndex = value).Checked = True
    3. End Sub
    4. Private Function getOption() As Integer
    5. Return GroupBox1.Controls.Cast(Of RadioButton)().First(Function(e) e.Checked).TabIndex
    6. End Function
    ...indem du bis zum 1. gecheckten Radiobutton in der Groupbox analysierst.
    Es kann nur ein Radiobutton in der Groupbox gechecked sein.

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

    Obige Methoden must du natürlich an deine Groupboxen anpassen. Ggoupbox1 <=> DeineGroupbox
    Wenn RB1 in GB1 gechecked (getOption-Methode) dann RB1 in GB2 deaktivieren (setOption-Methode)
    Sollte die Reihenfolge der Radiobuttons beider Groupboxen gleich verlaufen, dann kannst du das natürlich gleich ohne den Methoden machen...
    Edit:
    Sorry, ich sehe gerade - das geht so nicht... :/ da muss ja eine andere Option gechecked werden...
    aber wie übergebe ich den SelectedIndex an die jeweils andere GB?
    Das geht aus deinen Angaben nicht hervor, welcher Radiobutton dann gecheckt sein soll...
    Welchen RB möchtest du den dann gechecked haben?
    In diesem Fall eignen sich die Radiobuttons in einer Groupbox nicht -> nehme dazu Checkboxen...

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

    Radiobuttons kann man als besondere Checkboxen auffassen, mit sehr eigentümlichen Verhalten.
    Nämlich liegen mehrere RBs in einem Container, so unchecken sie sich gegenseitig, sodass insgesamt immer nur ein RB gecheckt ist.

    Ja, und das funktioniert nicht, wenn die RBs, die aufeinander einwirken sollen, in verschiedenen Containern liegen - etwa in verschiedenen Groupboxen.

    Ist das sehr wichtig?

    Weil funktional leisten 2 aufeinander einwirkende RBs keinen Deut mehr, als eine einzelne Checkbox auch macht: Man kann 2 Zuständen abwechseln
    Ok, noch mal kurz erklärt:

    ich wähle in der GroupBox1 z.B. RadioButton1 aus, dann soll der in der GroupBox2 nicht mehr anwählbar sein. Und wenn ich in der GroupBox2 dann RdioButton4 auswähle, soll der in der GroupBox1 nicht mehr anwählbar sein können. Kann das auch mit CheckBoxen machen, was aber im Endeffekt egal ist, da immer nur eins per GroupBox auswählbar sein soll.

    Falls jemand einen besseren Vorschlag hat wie ich das anders lösen könnte, dann her damit. Bin für alles offen. Es müssen aber pro "Group" 7 Items sein, und es darf nicht in der Group2 das gleiche ausgewählt sein wie in Group1, und umgekehrt.

    Parmaster schrieb:

    Ok, noch mal kurz erklärt:
    Dass du nochmal erklärst, was wir längst verstanden haben, lässt mich vermuten, du hast nicht verstanden, was ich erklärte:

    Nämlich dass ein Radio-Button-Paar, was du groupbox-übergreifend bilden willst (was halt so nicht geht, jdfs nicht ohne ziemlichen Aufwand), nichts anderes leistet als eine Checkbox.

    also statt 7 Radiobutton-Paare könntest du vonne Funktionalität her eiglich besser 7 Checkboxen nehmen - da kannste dann auch die 2.Groupbox sparen.


    Edit:

    Parmaster schrieb:

    VB1963 schrieb:

    Menst du da jetzt die Eigenschaft .Enabled ?
    Genau
    ok, nu bin ich draussen.
    Weil das scheint mir ja Quatsch, die Radiobuttons zu disablen - das kann man ja dann gar nimmer rückgängig machen - sind ja disabled.


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

    Ich hab das schon verstanden, da aber eine Checkbox beim starten des Programms entweder gechecked ist oder nicht, bräuchte ich dann noch einen dritten Status (was eine CB ja hat).

    Es darf dann trotzdem nur eine CB gechecked, eine unchecked, und alle anderen müssen Indeterminate bleiben. Geht das wenn die 7 CBs wieder in eine Gruppe packt?


    Also, wenn man oben nun z.B. das dritte RB auswählt, soll dann unten das dritten nicht mehr auswählbar sein, beim 4. oben das 4. unten. Als Beispiel kann man oben schon nicht mehr das 5. wählen, da dies bereits unten ausgewählt wurde.

    Ich wüsste zwar wie ich das machen könnte, aber dann hätte ich 14 mal den gleichen Code da stehen, was irgendwie schwachsinnig wäre.

    und wenn man dann den 2. test anwählt, wird dann der erste test1 wieder enabled​


    Genau, so sollte es sein. Also immer nur das Gegenstück soll nicht mehr auswählbar sein.

    probierma den hier

    VB.NET-Quellcode

    1. Public Class frmFunnyRBs
    2. Public Sub New()
    3. InitializeComponent()
    4. For Each pair In {RadioButton1, RadioButton2, RadioButton3, RadioButton4, RadioButton5, RadioButton6, RadioButton7}.Zip({RadioButton8, RadioButton9, RadioButton10, RadioButton11, RadioButton12, RadioButton13, RadioButton14}, Function(x, y) {x, y})
    5. Dim bnd = pair(0).DataBindings.Add("Enabled", pair(1), "Checked", True, DataSourceUpdateMode.OnPropertyChanged)
    6. AddHandler bnd.Format, AddressOf InvertFormat
    7. bnd.ReadValue()
    8. bnd = pair(1).DataBindings.Add("Enabled", pair(0), "Checked", True, DataSourceUpdateMode.OnPropertyChanged)
    9. AddHandler bnd.Format, AddressOf InvertFormat
    10. bnd.ReadValue()
    11. Next
    12. End Sub
    13. Private Sub InvertFormat(sender As Object, e As System.Windows.Forms.ConvertEventArgs)
    14. e.Value = Not CBool(e.Value)
    15. End Sub
    16. End Class


    Oder so:

    VB.NET-Quellcode

    1. Public Class frmFunnyRBs
    2. Public Sub New()
    3. InitializeComponent()
    4. For Each pair In FlowLayoutPanel1.Controls.OfType(Of RadioButton).Zip(FlowLayoutPanel2.Controls.OfType(Of RadioButton), Function(x, y) {x, y})
    5. AddHandler pair(0).CheckedChanged, Sub(s, e) pair(1).Enabled = Not pair(0).Checked
    6. AddHandler pair(1).CheckedChanged, Sub(s, e) pair(0).Enabled = Not pair(1).Checked
    7. Next
    8. End Sub
    9. End Class

    Dateien
    • FunnyRBs00.zip

      (13,77 kB, 132 mal heruntergeladen, zuletzt: )

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

    Parmaster schrieb:

    ich habe zwei GroupBoxes mit jeweils 7 RadioButtons.
    Oder Du machst da ein UserControl draus, das Du 2 Mal instanziierst.
    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:

    Oder Du machst da ein UserControl draus, das Du 2 Mal instanziierst.


    Das wäre natürlich auch eine Möglichkeit, wenn ich wüsste wie. ^^

    @ErfinderDesRades

    Danke für den Code! :thumbup: Ich schau mir den mal an, auch wenn ich noch nicht ganz verstehe was die einzelnen Methoden machen, wie z.B. beim zweiten Code das .Zip. Ich such mal danach!

    Parmaster schrieb:

    wenn ich wüsste wie
    So zum Beispiel:
    CheckTest.zip
    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!

    Parmaster schrieb:

    auch wenn ich noch nicht ganz verstehe
    Das nicht-verstandene daran ist eiglich für dich am wertvollsten: so kannst du wirklich was lernen, was Neues (zur Not auch fragen).

    .Zip() ist eine Linq-Extension, und nicht unnütz, wie man sieht.
    (wird übrigens auch im ersten Code ebenso verwendet)
    @ErfinderDesRades

    Ja, das stimmt, ich will das ja auch lernen und verstehen, sonst nützt es mir ja auch nichts. Deswegen sagte ich ja, das ich mir das mal ansehe und bei den Methoden die ich nicht kenne, versuche herauszufinden was es ist und was es macht. :thumbup:
    Will ja auch nicht dumm sterben. ^^

    @RodFromGermany

    Danke, ich schau es mir mal an.


    EDIT:

    hab mir das mal angeschaut, und ist im Prinzip genau das was ich brauche. Ich versuche nun daraus ein Control zu machen, welches man einfach nur auf die Form ziehen muss, und man die Anzahl der vorhandenen RadioButtons angeben kann. Dann noch umschreiben in C#.
    Ist zwar eigentlich nicht nötig, aber vielleicht kann es dann ja jemand gebrauchen.

    Wieso gibt es eigentlich keine fertige RadioGroup? Ich glaub bei anderen IDE's gibt es sowas (Embarcadero z.B.).

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