两个控件正确地引用另一个

时间:2011-05-06 11:55:36

标签: c# winforms c#-4.0 circular-dependency

我在.net表单应用程序中有一个ComboBox和一个DateTimePicker控件。两个控件关系的所需功能是对一个控件的修改将改变另一个控件的值。修改其他控件的逻辑在每个控件更改事件中; ComboBox“SelectedIndexChanged”和DateTimePicker“已更改”,它看起来如下所示:

othercontrol.value = value;

有没有一种明确的方法可以隔离各个控件的更改事件,以确定它们是否是由UI发送而不是其他控件的更改事件,以阻止当前设置将导致的循环?

当我写这篇文章时,我意识到我可能通过调用change事件并在相应的change事件中传递参数的一些变化而不是简单地设置其他控件的值来更改其他控件值。

2 个答案:

答案 0 :(得分:1)

然后试试。

好吧,这有点hacky但这可行:

private bool eventBubbledDate = false;
private bool eventBubbleCombi = false;

protected override MyCombi_OnChange(object sender, eventargs e)
{
  if (eventBubbledDate)
  {
    eventBubbledDate = false;
    return;
  }
  eventBubbleCombi = true;
  myDateTime.Value = myCombi.SelectedValue;
}

protected override MyDateTime_OnChange(object sender, eventargs e)
{
  if (eventBubbleCombi )
  {
     eventBubbleCombi = false;
     return;
  }

  // process DateStuff here
  // update other control
  eventBubbledDate = true;
}

或者,您可以使用Enumeration来跟踪状态而不是使用布尔'flags',但我认为bool更容易演示。

答案 1 :(得分:1)

您可以在设置值之前删除控件的事件处理程序,并在设置值后立即将其添加回来。

othercontrol.SelectedChanged -= othercontrol_SelectedChanged;
othercontrol.value = value;
othercontrol.SelectedChanged += othercontrol_SelectedChanged;