【问题标题】:Stop double call to function using radioButton CheckedChanged events?使用 radioButton CheckedChanged 事件停止对函数的双重调用?
【发布时间】:2013-12-29 15:32:42
【问题描述】:

我有 3 个单选按钮都保存在一个组合框中(因此一次只能标记 1 个)。我的代码可以正常工作,但为了更快地更新我的标签,我想在选择新的单选按钮时阻止该函数被调用两次。

例如,在下面的代码中,我的默认值是 rb1,然后单击 rb2,rb1 CheckedChanged 事件触发并更新标签,然后 rb2 的 CheckedChanged 事件再次触发并更新标签(相同的值)。

如果标签已更新一次,那么添加一些额外条件的最佳方法是什么,然后停止再次调用该函数?

代码:

private void rb1_CheckedChanged(object sender, EventArgs e)
    {
        if (cmbLetterType.Text.Length != 0)
        {
            updatePrintedCntLabel();
        }
    }

private void rb2_CheckedChanged(object sender, EventArgs e)
{
    if (cmbLetterType.Text.Length != 0)
    {
        updatePrintedCntLabel();
    }
}

private void rb3_CheckedChanged(object sender, EventArgs e)
{
    if (cmbLetterType.Text.Length != 0)
    {
        updatePrintedCntLabel();
    }
}

编辑:澄清一下,这是我在其中执行此操作的 C# Winforms 应用程序。

【问题讨论】:

    标签: c# .net winforms radio-button groupbox


    【解决方案1】:

    考虑一下

    public class Form1 : Form 
    {
    
    
        public Form1()
        {
            rb1.CheckedChanged += rb_CheckedChanged;
            rb2.CheckedChanged += rb_CheckedChanged;
            rb3.CheckedChanged += rb_CheckedChanged;
        } 
    
        private void rb_CheckedChanged(object sender, EventArgs e)
        {
    
            if (!((Radiobutton)sender).Checked) return;
    
            if (cmbLetterType.Text.Length != 0)
            {
                updatePrintedCntLabel();
            }
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      事件正在做他们告诉他们做的事情

      如果您不想更新标签两次,请不要
      很简单,如果值没有改变,那就不要更新
      保存值并测试更改

      为什么会有三个相同的事件处理程序?
      您可以将多个事件连接到同一个处理程序。

      即使您使用 Baldrick 的方法,您也可以从发件人那里获得按钮。

      WinForm 上的后期标签,但仍然可以使用相同的方法( if (labelVal = value) return; )
      一般使用公共属性

      private string labelVal = string.empty;
      
      public string LabelVal
      {
          get { return labelVal; } 
          set
          { 
              if (labelVal = value) return;
              labelVal = value;
              NotifyPropertyChanged("LableVal");
          }
      }
      

      【讨论】:

        【解决方案3】:

        将您的条件更改为:

        if (cmbLetterType.Text.Length != 0 && rb1.Checked)
        

        对其他 2 个处理程序也执行此操作(使用 rb2.Checked 和 rb3.Checked),每个处理程序只会在它成为 已检查 而不是 未检查 时触发em>。

        【讨论】:

        • 看,这很奇怪。最初我尝试过。我已经测试并确认,当 rb1 的 checkChanged 事件触发时,它的值已经变为 false。因此,在给定条件的情况下,检查它是否已检查并且我在 checkedChanged 事件中的组合框长度永远不会完全评估。
        • 在这种情况下,新检查项的事件处理程序是否仍不能正常工作?您所需的代码仍应运行一次。
        • 啊,你是对的。似乎在我的测试过程中,我对所有不同的标准都感到有些慌乱,当我通过断点检查这个问题时,我还没有设置 cmbLetterType 的值。谢谢!
        猜你喜欢
        • 2010-10-03
        • 1970-01-01
        • 2015-11-22
        • 1970-01-01
        • 2019-09-28
        • 2020-07-31
        • 1970-01-01
        • 1970-01-01
        • 2011-05-20
        相关资源
        最近更新 更多