0

我对 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!

因此,当按钮未选中时,也会调用事件处理程序。我怎样才能防止这种情况?我已经阅读了一些问题,但对于我的水平来说它们很复杂,因此我无法提取我需要的信息。解释性的答案非常受欢迎。谢谢。

4

7 回答 7

1

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

if(btn.Checked)
{
    Console.WriteLine("{0} Radio checked!", btn.Text);
}
于 2013-07-19T11:29:27.557 回答
0

您在这里面临的问题是事件被称为a)当控件被选中时和b)当控件未被选中时。对此的提示是该事件称为 CheckedChanged。

在事件处理程序中,您需要过滤调用。将 sender 转换为 CheckBox 并检查“checked”属性:

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);
    }
}
于 2013-07-19T11:29:05.897 回答
0

您订阅的事件是CheckedChanged如此自然,当您选中和取消选中时它都会被点击。

将您的功能更改为仅选中已选中的功能。

private void radio_checked(object sender, EventArgs e)
{
    RadioButton btn = (RadioButton)sender;
    if(btn.Checked)
        Console.WriteLine("{0} Radio checked!", btn.Text);
}
于 2013-07-19T11:29:59.850 回答
0

尝试这个:

private void radio_checked(object sender, EventArgs e)
{
    RadioButton btn = (RadioButton)sender;
    if (btn.Checked)
        Console.WriteLine("{0} Radio checked!", btn.Text);
}
于 2013-07-19T11:30:12.833 回答
0

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

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

    if (btn.Checked)
    {
       Console.WriteLine("{0} Radio checked!", btn.Text);
    }
}
于 2013-07-19T11:30:31.693 回答
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);
    }
}

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

于 2013-07-19T11:31:12.553 回答
0

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

于 2013-07-19T11:32:57.560 回答