两个控件正确相互引用
本文关键字:引用 控件 两个 | 更新日期: 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;
}
或者,您可以使用枚举来跟踪状态,而不是使用布尔"标志",但我认为布尔值更容易演示。