单选按钮事件执行两次

时间:2012-11-14 13:26:07

标签: c# winforms

在我的项目中,有两个radioButtons。通过执行,我已经给了相同的CheckedChanged事件 像这样的东西:

DoctorRadioButton.CheckedChanged += new EventHandler(RadioButton_CheckedChanged);
PatientRadioButton.CheckedChanged += new EventHandler(RadioButton_CheckedChanged);

我将两个RadioButton保存在Panel中,使其成为真,而另一个则为假。 现在的问题是我在RadioButton_CheckedChanged事件中实现了一个非常大的代码 每当用户改变两个RadioButton中任何一个的状态时,事件就会提升两次。
经过这么多个小时,我得到了答案,事件正在提升两次,因为两个RadioButton状态都被改变了(因此,事件将被提升两次)。为了解决这个问题,我试图暂时取消事件:

RadioButton_CheckedChanged 事件:(不工作

     if (DoctorRadioButton.Checked)
     {
         PatientRadioButton.CheckedChanged -= RadioButton_CheckedChanged; //Un
         //
         //My functions       
         //
         PatientRadioButton.CheckedChanged += new EventHandler(RadioButton_CheckedChanged);
     }
     else
     {
         DoctorRadioButton.CheckedChanged -= RadioButton_CheckedChanged;
         //
         //My functions         
         //
         DoctorRadioButton.CheckedChanged += new EventHandler(RadioButton_CheckedChanged);
     }

尽管事件正在执行两次。我知道我在挂钩和脱钩方面做错了什么。请帮助。

4 个答案:

答案 0 :(得分:2)

您可以检查发件人RadioButton并相应地放置您的代码 -

    void RadioButton_CheckedChanged(object sender, EventArgs e)
    {
        RadioButton senderRadioButton = sender as RadioButton;
        if (senderRadioButton.Equals(DoctorRadioButton))
        // OR senderRadioButton.Name == "DoctorRadioButton"
        {
            // Place your code here for DoctorRadioButton.
        }
        else
        {
            // Place your code here for PatientRadioButton.
        }
    }

<强>更新

如果你不能为两个radioButtons使用两个不同的处理程序,并且只想勾选复选框,你可以执行此操作 -

    void RadioButton_CheckedChanged(object sender, EventArgs e)
    {
        RadioButton senderRadioButton = sender as RadioButton;
        if (senderRadioButton.IsChecked)
        {
            // Place your code here for check event.
        }
    }

答案 1 :(得分:1)

对于一个非常简单(尽管粗糙)的解决方案,挂钩两个单选按钮,并只将其中一个挂钩到处理程序:因为检查一个无线电取消选中另一个,它会按计划工作。

更复杂的方法是使用支持属性,如下所示:

class myForm
{
    private bool radioStatus = false; // depends on the default status of the radios
    private bool RadioStatus 
    {
        get{return radioStatus;} set {radioStatus = value; Checked_Changed();}
    }

    public myForm()
    {
    // Lambdas as handlers to keep code short.
    DoctorRadioButton.CheckedChanged += (s,args)=> 
        { if((s as RadioButton).Checked) RadioStatus = true; };
    PatientRadioButton.CheckedChanged += (s,args)=> 
        { if((s as RadioButton).Checked) RadioStatus = false; };
    }

    void Checked_Changed()
    {
        if (RadioStatus) // = true --> DoctorRadioButton was checked
        {
            //code
        }
        else // = false --> PatientRadioButton was checked
        {
            //other code
        }
    }
}

这种方法的优点是可以让你从UI中抽象出来。

答案 2 :(得分:-1)

将两个单选按钮放在同一个面板或组框中,并自动将它们分组,以便一次只能选择一个。

答案 3 :(得分:-1)

这是一个迟到的解决方案,但我发现你的问题没有正确答案,所以我发布它可能对你有用

为单选按钮创建单击事件,简单地将代码用于每次点击你的单选按钮检查并执行代码:):))

private void DoctorRadioButtons_Click(object sender, EventArgs e)
        {
           //Your code on Doctor Radio Button
        }

private void PatientRadioButton_Click(object sender, EventArgs e)
        {
           // Your code on Patient Radio Button
        }