我在Windows Forms上有超过 40 个控件(TextBox、RadioButton、CheckBoxes 等)。每个控件都注册了 EventHandlers(TextChanged、CheckChanged 等)。
我想防止在表单初始化期间触发这些事件。
在初始化之前取消订阅所有事件并在以后订阅是很费力的。
实现这一目标的最佳方法是什么?
我在Windows Forms上有超过 40 个控件(TextBox、RadioButton、CheckBoxes 等)。每个控件都注册了 EventHandlers(TextChanged、CheckChanged 等)。
我想防止在表单初始化期间触发这些事件。
在初始化之前取消订阅所有事件并在以后订阅是很费力的。
实现这一目标的最佳方法是什么?
虽然您提供的信息很少,但您当然可以使用:
Boolean Loading = false;
{
Loading = true;
LoadData();
// LoadData must set the fact it's finished...
}
然后在事件处理程序中:
if (Loading)
return;
我通常愚蠢的简单解决方案是有一个由每个事件处理程序检查的表单属性。
例如
private bool _inhibit = false;
private void Initialise()
{
_inhibit = true;
try
{
// initialise fields
}
finally
{
_inhibit = false;
}
}
Then just check the state of _inhibit in each handler.
不确定是否有一种不杂乱的方式来做到这一点。
InitializeComponent
在表单的构造函数中设置事件处理程序。像:
form()
{
InitializeComponent();
// Set the event handlers to your controls like:
this.button1.Click += new System.EventHandler(this.button1_Click);
// Or
this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged);
}
您可以枚举所有控件,例如:
private void DisableAllHandlers()
{
foreach (var control in this.Controls)
{
// Use reflection
}
}
并使用文章如何从控件中删除所有事件处理程序以禁用选定控件的处理程序的来源。