两个控件正确相互引用

本文关键字:引用 控件 两个 | 更新日期: 2023-09-27 17:55:21

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

othercontrol.value = value;

有没有一种明确的方法可以将更改事件与相应的控件隔离开来,以确定它们是由 UI 发送的还是由其他控件的更改事件发送的,以防止当前设置将导致的循环?

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

两个控件正确相互引用

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

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

试试这个。

好吧,这有点笨拙,但这样可以工作:

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

或者,您可以使用枚举来跟踪状态,而不是使用布尔"标志",但我认为布尔值更容易演示。