单选按钮检查已更改的事件触发两次

请阅读我的问题,这不是一个重复的问题。

我在Windows窗体上有三个单选按钮,所有这些按钮都有相关的常见’CheckedChanged’事件。 当我单击任何这些单选按钮时,它会触发“CheckedChanged”事件两次。

这是我的代码:

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

我插入断点,此事件中的整个代码迭代两次。 请告诉我它为什么会这样?

正如其他回答者正确地说的那样,事件被触发两次,因为每当一个组中的一个RadioButton被检查时,另一个将被取消选中 – 因此被检查的已更改事件将触发两次。

要仅针对刚刚选择的RadioButton在此事件中执行任何工作,您可以查看发送方对象,执行以下操作:

 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); } } } 

只要Checked属性发生更改,就会引发CheckedChanged。 如果选择RadioButton,则取消选中先前选择的RadioButton(触发CheckedChanged),然后检查新的RadioButton(触发CheckedChanged)。

它会触发一次单选按钮从已选中转换为未选中,再次为单选按钮从未选中转换为已检查(即已检查状态的任何更改都会触发事件)

要避免它,只需检查是否已选中radioButton

例如:

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

您可以为每个RadioButton设置AutoCheck属性为true,然后捕获Click事件而不是CheckChanged事件。 这将确保只触发一个事件,并且处理程序中的逻辑可以强制发送者在需要处理单击时键入RadioButton。 如果处理程序逻辑很简单,通常可以避免强制转换。 这是一个处理三个控件的示例,rbTextNumeric,rbTextFixed和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"; } } } }