单选按钮事件执行两次

问题描述 投票:0回答:5

在我的项目中,有两个单选按钮。我通过做

 给出了相同的 
CheckedChanged
事件 像这样的东西:

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

我将两个单选按钮保留在

Panel
中,以使它们一个为 true,另一个为 false。
现在的问题是我在
RadioButton_CheckedChanged
事件中实现了非常大的代码。
每当用户更改两个单选按钮中任何一个的状态时,该事件都会引发两次。
经过几个小时后我得到了答案,该事件引发了两次,因为两个 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);
     }

尽管事件执行了两次。我知道我在“挂钩”和“脱钩”中做错了什么。请帮忙。

c# winforms
5个回答
2
投票

您可以检查发件人单选按钮并相应地放置您的代码,如下所示 -

    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.
        }
    }

更新

如果您不能对两个单选按钮使用两个不同的处理程序,并且只想在选中复选框时执行代码,您可以这样做 -

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

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 中进行一些抽象。


0
投票

我添加了“已选中”复选框,因为一次只能选中一个单选按钮(它们分组在一个组框中)。如果sender.Checked==false,则不会运行处理。仅当其中一个按钮切换到 Checked==true 时才会运行处理。 如果您想用其他方法进行处理,请将变量“选择”替换为您选择的开关。

       private void rbMatchType_CheckedChanged(object sender, EventArgs e) {
        RadioButton senderRadioButton = sender as RadioButton;
        string selection = "";
        if (senderRadioButton.Checked) {
            if (senderRadioButton.Equals(DoctorRadioButton)) {
                selection="DOCTOR";
            } else { 
                selection="PATIENT";
            }// add "else if" if you have more than 2 buttons
            Processing(selection); // Only processes when the event is triggered by Checked==true
        }

-1
投票

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


-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
        }
© www.soinside.com 2019 - 2024. All rights reserved.