【问题标题】:Can I change a form control value but not trigger an event?我可以更改表单控件值但不触发事件吗?
【发布时间】:2012-07-23 10:43:48
【问题描述】:

这个问题可能很难问,但我会尽力而为。 SO 和其他地方有很多关于在更改时触发事件的内容,但我想要相反的内容(至少我认为我这样做!)。

我在表单上有多个控件 (numericUpDowns)。对于每个 updown,我都在观察一个值是否已更改,它将触发一个“ValueChanged”方法。

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    //do some complicated code ...
} 

这一切都很好地与上下控件的更改导致重新计算 fomr 但是如果我想在一个方法中设置一些值并且直到最后才调用我的ValueChangedmelthods 怎么办?

我几乎想要这样的东西

// start ignoring form events here
numericUpDown1.Value = 500;
numericUpDown2.Value = 50;
numericUpDown3.Value = 0;
// resume detecting form events here !

有没有办法打开和关闭它?这是我应该担心的事情吗?

我有限的 C# 知识将我带到这一点的最好的事情是创建一个名为“bIgnoreEvents”的变量并在我的每个 ValueChanged 方法中使用它...

private void numericUpDown1_ValueChanged(object sender, EventArgs e)
{
    if (!bIgmoreEvents)
    {
        //do some complicated code ...
    }
}

这会跳过代码,但看起来很乱。有没有更简单的方法?

【问题讨论】:

  • 你为什么觉得它很乱?假设您的意思是if (!bIgnoreEvents),它将以一种直接、可理解和可维护的方式很好地完成工作。
  • 谢谢,现在神奇地修复了。)好吧,也许不是“凌乱”,也许只是不优雅......因为我对此很陌生,我经常担心养成坏习惯...... .
  • 好吧,优雅和不那么易读的聪明之间有一条很好的界限,既然你是新手,我建议不要那样做(至少一开始不是)。相反,专注于获得可行的东西,同时尽可能简单易懂。关注KISS principle
  • 谢谢!现在,我在 S.O. 做什么?带着这个问题?删除它?没有真正的“不需要回答”按钮......
  • 您可以编写自己的答案并将其保存以供后代使用。

标签: c# .net winforms events


【解决方案1】:

你也可以这样做:

var eventHandler = new EventHandler((o, a) =>
{
    //do stuff
});

numericUpDown1.ValueChanged += eventHandler;

//normal behaviour

//remove eventHandler    
numericUpDown1.ValueChanged -= eventHandler;

numericUpDown1.Value = 500;
numericUpDown2.Value = 50;
numericUpDown3.Value = 0;

//add eventHandler
numericUpDown1.ValueChanged += eventHandler;

【讨论】:

  • 这仍然是被广泛接受的防止事件发生的方法吗? [通过在“触发”操作后删除然后重新添加]似乎应该有更好的方法。
  • 哈哈我不知道,这是 6 年前 :) 它可能仍然有效。但是,即使用户没有做任何更改,事件也不应该处理吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多