C#如何防止分配给多个控件的事件处理程序被调用两次?

时间:2013-07-19 11:23:51

标签: c# event-handling

我对C#很新,我在Windows窗体应用程序中遇到了事件处理程序问题。我在运行时创建了多个单选按钮(存储在buttonz列表中),并且都分配了相同的事件处理程序。

foreach循环中:

buttonz.Add(new RadioButton());
buttonz[buttonz.Count - 1].CheckedChanged += new EventHandler(radio_checked);

以下是我的事件处理程序:

private void radio_checked(object sender, EventArgs e)
{
    RadioButton btn = (RadioButton)sender;
    Console.WriteLine("{0} Radio checked!", btn.Text);
}

输出结果为:

Button1 Radio checked! (1st button is checked)
Button1 Radio checked! (2nd button is checked)
Button2 Radio checked!
Button2 Radio checked! (3rd button is checked)
Button3 Radio checked!

因此,当取消选中该按钮时,也会调用事件处理程序。我怎么能阻止这个?我已经阅读了几个问题,但是我的水平很复杂,因此无法提取我需要的信息。解释性答案非常受欢迎。感谢。

7 个答案:

答案 0 :(得分:1)

您可以检查处理程序中是否选中了按钮:

if(btn.Checked)
{
    Console.WriteLine("{0} Radio checked!", btn.Text);
}

答案 1 :(得分:0)

您遇到的问题是该事件被调用 a)检查控制时 b)未选中控件时。 对此的提示是该事件被称为CheckedChanged。

在事件处理程序中,您需要过滤调用。将发件人转发给CheckBox并检查“已检查”属性:

private void radio_checked(object sender, EventArgs e)
{
    //Check if this is a radio button. It might be a checkbox!
    if(sender is RadioButton)
    {
        RadioButton btn = (RadioButton)sender;
        if(btn.Checked)
            Console.WriteLine("{0} Radio checked!", btn.Text);
    }
}

答案 2 :(得分:0)

您订阅的活动是CheckedChanged,因此当您检查和取消选中时,它会被点击。

将您的功能更改为仅显示已选中的内容。

private void radio_checked(object sender, EventArgs e)
{
    RadioButton btn = (RadioButton)sender;
    if(btn.Checked)
        Console.WriteLine("{0} Radio checked!", btn.Text);
}

答案 3 :(得分:0)

试试这个:

private void radio_checked(object sender, EventArgs e)
{
    RadioButton btn = (RadioButton)sender;
    if (btn.Checked)
        Console.WriteLine("{0} Radio checked!", btn.Text);
}

答案 4 :(得分:0)

如果您只想在已选中的单选按钮上写行,请在以下情况下添加:

private void radio_checked(object sender, EventArgs e)
{
    RadioButton btn = (RadioButton)sender;

    if (btn.Checked)
    {
       Console.WriteLine("{0} Radio checked!", btn.Text);
    }
}

答案 5 :(得分:0)

这里的问题是,当选中单选按钮并且未选中单选按钮时会触发CheckedChanged事件处理程序,这就是它触发2次的原因。

private void radio_checked(object sender, EventArgs e)
{
    if((sender as RadioButton).Checked)
    {
        RadioButton btn = (RadioButton)sender;
        Console.WriteLine("{0} Radio checked!", btn.Text);
    }
}

这样的方法的功能性仅在选中按钮时运行,而不是在未选中时运行。

答案 6 :(得分:0)

您订阅的事件称为“CheckedChanged”,因此这意味着当RadioButton的检查状态为已更改时将引发此事件 - 这意味着在检查时它将被抬起或未选中