【问题标题】:C# How to prevent the event handler assigned to multiple controls being called twice?C#如何防止分配给多个控件的事件处理程序被调用两次?
【发布时间】:2023-03-21 02:45:02
【问题描述】:

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

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

【问题讨论】:

  • 我正在使用 Winforms 应用程序。忘记添加问题了。
  • 您对每个按钮使用相同的事件处理程序 - 当然,当单击任何按钮时,都会执行相同的事件处理程序。使用 sender 参数来区分按钮或使用不同的事件处理方法。
  • 我想使用同一个处理程序,问题是处理程序被调用了两次。感谢人们,他们指出了我该如何解决这个问题。

标签: c# event-handling


【解决方案1】:

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

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

【讨论】:

  • 原来没有什么好解释的:) +1 最简单的答案,虽然我会接受第一个答案。谢谢李。
【解决方案2】:

您在这里面临的问题是事件被调用 a) 当控制被检查并且 b) 当控件未选中时。 对此的提示是该事件称为 CheckedChanged。

在事件处理程序中,您需要过滤调用。将发件人投射到 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);
    }
}

【讨论】:

    【解决方案3】:

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

    将您的函数更改为仅点击选中的函数。

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

    【讨论】:

      【解决方案4】:

      试试这个:

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

          【解决方案6】:

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

          【讨论】:

            【解决方案7】:

            这里的问题是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);
                }
            }
            

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

            【讨论】:

              猜你喜欢
              • 2010-09-28
              • 1970-01-01
              • 2010-10-30
              • 1970-01-01
              • 1970-01-01
              • 2011-07-08
              • 2012-04-28
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多