2014-01-09 177 views
1

我的程序中有一个对话框,用户可以更改某些设置。当表单关闭时,更改将存储在应用程序的设置文件中。初始化表单控件

每次加载对话框时,设置都将恢复到表单的构造函数中。这就产生了一个问题:在表单完全打开的时候,如果没有用户做任何事情,CheckedChanged事件(以复选框为例)将始终触发!

我还没有尝试过这一点,但它是我的猜测克服这个问题的一种方法是在数据 - >应用程序设置下拉取设计器中控件的初始状态。但是这种方法需要为每个控制单独设置 - 由于大量控制是一个问题,因此不切合实际。

是否有一种(更好的)方式来预先初始化窗体上的控件而不触发CheckedChange事件?

回答

0

您可以创建一个名为IsFormLoading的类级变量。在构造函数的开始处将其设置为True,然后在所有控件初始化并且设置已恢复后,在最后将其设置为False。

您不希望触发的表单上的每个事件可能会检查if (IsFormLoading)return;

+0

更好的希望在中间设置该变量异步发生。否则,该标志将变得毫无用处。 –

+0

@ M.Babcock你是对的,但他只是从文件中读取数据并设置控件的值。应该是安全的。 –

+0

@Grant:我试过你的解决方案,它工作的很好,只需要对代码做很少的修改。竖起大拇指。 – PeteD

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 
    } 
} 
+0

你的假设是正确的。这个解决方案可能是最强大的,但对我所需要的东西来说有点矫枉过正。对于严肃的项目绝对是一个好方法。 – PeteD

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无论控件值如何更改(用户单击,通过代码等),控件更改事件始终会触发。

+0

是的,这将工作。但我认为这是格兰特之前提出的一个主题的变体。 – PeteD