[英]Radio button checked changed event fires twice
请阅读我的问题,它不是重复的问题。
我在 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)
//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";
}
}
}
}
其他答案是正确的,但错过了潜在问题的原因。 当检查单选按钮时,发送的第一个事件是从未选中的项目的更改,但是如果您通过其控件名称检查其状态,您仍将看到其旧的选中状态,因为表单尚未更新。 要查看其真实状态,您需要转换发送者对象。 这允许您在需要时执行与正在取消选择的条件相关的任何操作。
在下面的常见情况下,多个单选按钮被发送到同一个处理程序事件。 简单地检查发件人的状态以进行检查在这里是行不通的,因为我们需要根据按下的单选按钮执行不同的操作。 所以首先我们忽略任何刚刚被取消检查的发件人。 然后我们通过控制名称识别检查的发件人以处理正确的操作。
private void ModeChangedExample(object sender, EventArgs e)
{
// multiple radio buttons come here
// We only want to process the checked item.
// if you need to something based on the item which was just unchecked don't use this technique.
// The state of the sender has not been updated yet in the form.
// so checking against rdo_A check state will still show it as checked even if it has just been unchecked
// only the sender variable is up to date at this point.
// To prevent processing the item which has just been uncheked
RadioButton RD = sender as RadioButton;
if (RD.Checked == false) return;
if (rdo_A.Name == RD.Name)
{
//Do stuff
}
if (rdo_B..Name == RD.Name)
{
// Do other stuff
}
if (rdo_C.Name == RD.Name)
{
// Do something else
}
}
当连续单击一系列 RadioButton 时,会发生这种双重检查的问题。我遇到了同样的问题。最后一次单击会给出两个结果。为了克服这个问题,我最后做了一个虚拟单击。双击停止了。试试这个方法。 文卡特拉曼
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.