我的程序中有一个对话框,用户可以在其中更改某些设置。表单关闭后,更改将存储在应用程序的设置文件中。
每次加载对话框时,都会在表单的构造函数中恢复设置。这会产生一个问题:CheckedChanged
事件(以复选框为例)将始终在表单完全打开时触发,而无需用户执行任何操作!
我没有尝试过这个,但我猜是克服这个问题的一种方法是在Data-> Application Settings下设计设计器中的控件的初始状态。但是这种方法需要为每个控件单独设置 - 由于大量控件是一个问题而不实用。
是否有(更好的)方法在不触发CheckedChange
事件的情况下预先初始化表单上的控件?
答案 0 :(得分:0)
您可以创建一个名为IsFormLoading
的类级变量。在构造函数的开头将其设置为True,然后在初始化所有控件并恢复设置之后将其设置为False。
您不希望触发的表单上的每个事件都可以检查if (IsFormLoading)
和return;
。
答案 1 :(得分:0)
我假设你在InitializeComponent()
方法中有事件订阅,如下所示:
private void InitializeComponent() {
...
this.checkBox1.CheckedChanged += new System.EventHandler(this.checkBox1_CheckedChanged);
...
}
并且在构造函数中调用InitializeComponent()
方法后恢复了表单的设置。
如果是这样,为什么不在使用保存的设置完全初始化所有控件后尝试推迟事件订阅。从InitializeComponent()
删除所有活动订阅(活动+ =处理程序),并在设置恢复后将其放置。
class Form1 : Form {
public Form1() {
InitializeComponent(); // remove event subscriptions from InitializeComponent
ApplySettings(); // restore settings
AttachEventHandlers(); // subscribe to events here
}
}
答案 2 :(得分:0)
所以基本的超视图是弹出式节目,用户检查一些框,关闭表单,更改是否保存好了?
第一个问题:如果您只是保存控件的当前状态(已选中,未选中等),为什么还要处理CheckedChange事件?为什么不在Form.FormClosing事件中保存控件的所有值?我的意思是我理解调用已更改的事件是因为您在表单加载事件中设置了值控件,但为什么要更改事件,除非您在更改事件被触发时执行某些操作?
如果您真的想使用CheckedChange事件来执行某些操作,那么您可以使用这样的计数器(我的头顶代码顶部,所以可能有点小错误):
private int _loadCount;
private void Form1_Load(object sender, System.EventArgs e)
{
_loadCount = 0;
//Code to load values for controls...
}
private void CheckBox1_CheckedChanged(Object sender, EventArgs e)
{
_loadCount++;
if(_loadCount > 1)
{
//Do something here...
}
else
{
//Do nothing, return false, etc...
}
}
在任何情况下,无论控件值如何更改(用户点击,通过代码等),AFAIK控件更改事件始终会触发。