2010-09-22 43 views
0

在我的项目中,我有一个设置窗体。如果发生任何变化,我必须通知用户如果他想离开该页面而不保存更改。在这个时候,我通过捕捉每一个控制变化事件来做到这一点。我确信有更好的方法 - 比如从容器中捕获更改事件。可能吗?C#捕捉控件的容器变化事件

+0

Web,WPF,Winforms?听起来像网络,但不能肯定... – 2010-09-22 05:37:17

+0

这是一个窗口窗体。 – Barun 2010-09-22 05:44:51

回答

1

你有正确的解决方案,但你可能想约捕获更改事件非常通用。例如,你可以在构造函数中InitializeComponent();线后尝试这样的权利:

foreach(Control c in Controls) { 
    c.TextChanged += new EventHandler(genericTextBox_TextChanged); 
} 

genericTextBox_TextChanged会形式,广泛hasChanged标志设置为true,或一些真正的基本类似。如果它有子控件,则可能需要将其作为循环遍历所有c子项的递归函数。

+0

如果存在各种类型的控件,该怎么办? – Barun 2010-09-22 05:43:03

+0

我的意思是,然后只有textChange事件不会工作 – Barun 2010-09-22 05:48:29

+0

最简单的选择是添加一些“作为X”线,每种类型的控制。 – 2010-09-22 05:49:23

0

如果它的网页,看看卸载事件的JavaScript

4

没有直接担心控件,而是如何创建一个Settings类,实现类似INotifyPropertyChanged和IDataErrorInfo的System.ComponentModel接口,并使用数据绑定来获取控件的值。

您的设置类不仅可以记录是否有任何更改,还可以更容易地验证用户输入。

一个好的开始是MSDN

+0

听起来有趣。你能否澄清一下呢? – Barun 2010-09-22 06:07:47

+1

这个背后的基本思想是为每个设置创建一个具有属性的Settings类,并让每个属性的setter更新该类的HasChanged标志。当表单打开时,您传递一个设置实例并将您的控件绑定到相应的属性。当用户关闭表单时,您可以检查HasChanged标志并提示用户设置是否已更改。关键是要确保你有一种方法可以在用户不想保存的情况下恢复原状,这是通过使类可克隆并在克隆副本上工作直到他们保存为止最容易完成的。 – 2010-09-22 06:15:00

1

让我为您提供某种解决方法。
我的建议是创建一个自定义数据集。然后添加对应于表单控件的表格。在此之后,您可以将每个表单控件绑定到此数据集。优点:您保留所有控件数据绑定。所以你不需要关心特定控制的变化。您只需控制数据集更改。
缺点(也许):在此之后,你应该重写设置预览机制。您不必更改控件,而必须更改数据。海事组织,它并不难,但我不知道你的应用程序中的这种方法
我认为这种方法至少易于调试。

+0

一些例子会非常有帮助。 – Barun 2010-09-22 06:30:13