【问题标题】:Two Controls Reference One-Another Correctly两个控件正确地相互引用
【发布时间】:2011-05-06 11:55:36
【问题描述】:

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

othercontrol.value = value;

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      那就试试吧。

      好的,这有点老套,但这会起作用:

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

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

      【讨论】:

      • 看起来发送者始终是控件本身,DateTimePicker for DateTimePicker Changed 事件。
      • 我会检查的。可能需要一点时间。非常感谢你的帮助!我会告诉你的。
      • 两个答案都有效,但从事件中删除方法使用的代码更少。非常感谢您的帮助。
      • 我要小心一点,删除事件并重新添加它可能会在其他看似无关的区域中导致难以调试的竞争条件。例如,如果您有许多事件排队,因为 windows 正在为另一个任务提供优先级,但是您的事件触发并删除处理程序只是让 windows 再次占用时间......这是一个痛苦的世界尝试调试这些就是为什么我没有提到它,以及为什么记录状态类似于 windows 和 .net 本身在内部的方式。
      • 感谢您的提醒。我会考虑到这一点。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-08
      • 2023-03-18
      相关资源
      最近更新 更多