2010-09-22 28 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