web-dev-qa-db-fra.com

Bouton radio coché: l'événement modifié se déclenche deux fois

Veuillez lire ma question, ce n'est pas une question en double.

J'ai trois boutons radio sur le formulaire Windows et tous ces boutons ont un événement "CheckedChanged" commun associé. Lorsque je clique sur l'un de ces boutons radio, il déclenche deux fois l'événement "CheckedChanged".

Voici mon code:

private void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    //My Code
}

J'ai inséré le point d'arrêt et le code entier dans cet événement se répète deux fois. Veuillez me dire pourquoi il se comporte comme ça?

28
Muhammad Ali Dildar

Comme les autres répondants le disent à juste titre, l'événement est déclenché deux fois, car chaque fois qu'un RadioButton au sein d'un groupe est vérifié, un autre n'est pas coché - par conséquent, l'événement modifié vérifié se déclenche deux fois.

Pour ne faire aucun travail au sein de cet événement pour le RadioButton qui vient d'être sélectionné, vous pouvez regarder l'objet expéditeur, en faisant quelque chose comme ceci:

void radioButtons_CheckedChanged(object sender, EventArgs e)
{
    RadioButton rb = sender as RadioButton;
    if (rb != null)
    {
        if (rb.Checked)
        {
            // Only one radio button will be checked
            Console.WriteLine("Changed: " + rb.Name);
        }
    }
}
63
David Hall

Pour l'éviter, vérifiez simplement si radioButton est coché

par exemple:

private void radioButton1_CheckedChanged(object sender, EventArgs e)
{
    if (radioButton1.Checked == true)
        //your code
}
5
jaleel

CheckedChanged est levé chaque fois que la propriété Checked change. Si vous sélectionnez un RadioButton, le RadioButton précédemment sélectionné est décoché (déclenché CheckedChanged), puis le nouveau RadioButton est vérifié (déclenché CheckedChanged).

4
kmatyaszek

Il se déclenche une fois pour la transition du bouton radio de cochée à non cochée, et à nouveau pour la transition du bouton radio de non cochée à cochée (c'est-à-dire que tout changement d'état coché déclenche l'événement)

2

Vous pouvez définir la propriété AutoCheck true pour chaque RadioButton, puis intercepter l'événement Click au lieu de l'événement CheckChanged. Cela garantirait qu'un seul événement est déclenché et que la logique du gestionnaire peut convertir l'expéditeur en type RadioButton si nécessaire pour traiter le clic. La conversion peut souvent être évitée si la logique du gestionnaire est simple. Voici un exemple qui gère trois contrôles, rbTextNumeric, rbTextFixed et rbTextFromFile:

        private void rbText_Click(object sender, EventArgs e)
    {
       flowLayoutPanelTextNumeric.Enabled = rbTextNumeric.Checked;
       txtBoxTextFixed.Enabled = rbTextFixed.Checked;
       flowLayoutPanelTextFromFile.Enabled = rbTextFromFile.Checked;
    }
0
Steve Stover
{
    public partial class Form3 : Form
    {
        public Form3()
        {
            InitializeComponent();
        }
        int click = 0;
        private void radioButton1_Click(object sender, EventArgs e)
        {
            click++;
            if (click %2==1)
            {
                radioButton1.Checked = true;
            }
            if (click %2==0)
            {
                radioButton1.Checked = false;
            }
            if (radioButton1.Checked==true)
            {
                label1.Text = "Cheked";
            }
            if (radioButton1.Checked==false)
            {
                label1.Text = "Uncheked";
            }
        }

    }
}
0
Emin