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?
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);
}
}
}
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
}
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).
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)
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;
}
{
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";
}
}
}
}