c # - loop gennem en dynamisk form og panel og kontroller om radioknapper kontrollerer eller ej

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har en form, der er dynamisk oprettet, på denne form er der flere radioknapper, der oprettes ved kørsel. Der er en knap på denne formular, f.eks. 'Næste', når brugeren klikker på det næste. Jeg vil løbe igennem og kontrollere, om en af ​​radioknapperne er tjekket, før jeg fortsætter, jeg har prøvet følgende:


    void nextButton\_Click(object sender, EventArgs e)
    {
        foreach (Control c in \_form.Controls)
        {
            if (c is RadioButton)
            {
                RadioButton radio = c as RadioButton;

                if (radio is RadioButton)
                {
                    if (radio.Checked == true)
                    {
                        //code continue to next 
                    }
                    else
                    {
                        MessageBox.Show("You must select at least one.");
                    }
                }

            }
        } 
    }


Med venlig hilsen
geo

Bedste reference


Du kan bruge Linq til at gøre det lettere


bool checked = \_form.Controls.OfType<RadioButton>().Any(rb => rb.Checked);


- EDIT -


Jeg opdaterede svaret til rekursivt søgning på alle kontroller.


bool IsChecked(Control parent)
{
    if (parent.Controls.OfType<RadioButton>().Any(rb => rb.Checked)) return true;

    foreach (Control c in parent.Controls)
        if (IsChecked(c)) return true;

    return false;
}

bool checked = IsChecked(\_form);

Andre referencer 1


Hvis en af ​​radioen er markeret, skal du afslutte sløjfen, så tilføj en exit betingelse, hvis man finder en.


 if (radio.Checked == true)
 {
      return;
 }
 else
 {
      MessageBox.Show("You must select at least one.");
 }


For at finde indlejrede kontroller skal du bruge:


 \_form.Controls.Find()

Andre referencer 2


Sandsynligvis ligger din radioknap i et panel. Og derfor er radioknappen angivet i panelets kontrolindsamling og ikke i formularen. Prøv det her i stedet:


    private static void CheckRadioButton(Control control)
    {
        foreach (Control c in control.Controls)
        {
            if (c is RadioButton)
            {
                if (((RadioButton)c).Checked == true)
                {
                    //code continue to next 
                }
                else
                {
                    MessageBox.Show("You must select at least one.");
                    return; //should be
                }
            }
            else if (c.Controls.Count > 0)
                CheckRadioButton(c);
        }
    }


Nu kalder du denne metode ved at sende form som argumentet. Ligesom dette eller deromkring:


void nextButton\_Click(object sender, EventArgs e)
{
    CheckRadioButton(this); //or whichever form it is..
}


Du behøver ikke unødigt at have en indre sløjfe igen, der bekræfter, om kontrollen er en radioknap.