Automatisieren von AddHandle RemoveHandle möglich?

  • VB.NET
  • .NET 5–6

Es gibt 3 Antworten in diesem Thema. Der letzte Beitrag () ist von exc-jdbi.

    Automatisieren von AddHandle RemoveHandle möglich?

    Hallo Community

    Auf meiner FrmMain gibt es mehrere GroupBox die mehrere (ca. 6 Stk) CheckBoxes beinhalten. In einer solchen GroupBox darf immer nur eine CheckBox aktiviert werden können, wie es mit den RadioButon möglich ist.


    Damit eine CheckBox in einer GroupeBox gesetzt werden kann, hole ich mir zuerst mit GroupBox.Controls.OfType die CheckBoxes in eine Array, setze ALLE CheckBoxes zurück mit Enable = false und Checked = false.

    Und genau da liegt das Problem. Ich möchte den CheckedChanged-Event automatisieren. Damit das CheckedChanged-Event gesetzt oder zurückgesetzt werden kann, gibt es wie wir wissen das RemoveHandle wie auch das AddHandle. Die sind so definiert.
    AddHandle <Ereignis>,<Handle>
    RemoveHandle <Ereignis>,<Handle>

    Der linke Teil <Ereignis>, der ist kein Problem, dafür habe ich die oben erwähnte CheckBox-Array die kann ich leicht mit einer Forschleife durchlaufen lassen.

    VB.NET-Quellcode

    1. ForEach cb in CheckBoxArray
    2. RemoveHandle cb.CheckedChanged, <Handle>
    3. Next

    Der rechte Teil <Handle> hingegen kann nicht so leicht mit in die Schleife einbezogen werden, da es mehrere GroupBox und somit auch unterschiedliche MethodenRüpfe gibt, die angesprochen werden müssen. Z.B.

    VB.NET-Quellcode

    1. CbGroup1_CheckedChanged(sender As Object, e As EventArgs) Handle ....
    2. CbGroup2_CheckedChanged(sender As Object, e As EventArgs) Handle ....
    3. CbGroup3_CheckedChanged(sender As Object, e As EventArgs) Handle ....

    Mir wäre geholfen, wenn ich die Adresse in eine Variable stecken könnte, wie z.B.

    VB.NET-Quellcode

    1. Dim EventMethode1 = AddressOf CbGroup1_CheckedChanged()
    2. Dim EventMethode2 = AddressOf CbGroup2_CheckedChanged()
    3. Dim EventMethode3 = AddressOf CbGroup3_CheckedChanged()

    dann könnte ich die die obere ForSchleife in etwa so gestalten.

    VB.NET-Quellcode

    1. ForEach cb in CheckBoxArray
    2. RemoveHandle cb.CheckedChanged, EventMethode1
    3. Next

    Nur bis jetzt habe ich das nicht hingekriegt. Hat jeman eine Idee wie man das machen könnte?

    Danke für die Antworten

    exc-jdbi

    exc-jdbi schrieb:

    Mir wäre geholfen, wenn ich die Adresse in eine Variable stecken könnte
    sowas?

    VB.NET-Quellcode

    1. Dim EventMethode1 = new EventHandler(AddressOf CbGroup1_CheckedChanged)
    Ich empfehle übrigens, statt des CheckedChanged-Events das Click-Event zu nehmen.
    Beim CheckedChanged muss man sich mit Ereignisketten rumärgern, und es löst auch - verfrüht - aus, wenn im InitializeComponents codeseitig gecheckt wird.
    Hingegen das Click löst nur bei User-Aktion aus - und da kann man ebensogut den Checkstate abfragen.
    Danke für die Antwort.

    Das habe ich in meinem kleinen Projekt schon gemerkt. Das setzen der Checked = true wird schon im DesignerCode als Event ausgelöst. Ich werde das Click-Even nachher kurz ausprobieren.

    ErfinderDesRades schrieb:

    Dim EventMethode1 = new EventHandler(AddressOf CbGroup1_CheckedChanged)

    Ich bin ein bisschen überrascht. Ist das jetzt wirklich so einfach? Werde ich auch ausprobieren müssen. Hab ich noch nie angewendet.

    Ich melde mich wieder heute oder nächste Woche nochmals.

    Freundliche Grüsse

    exc-jdbi