2010-08-26 110 views
5

有人可以幫助我檢測在c#中的窗體的任何控制的變化? 我有一個窗體上的許多控件,我需要禁用一個按鈕,如果任何形式的控制值改變。我在尋找一些內置的函數/事件處理程序/屬性,並不想讓一個定製的功能。如何檢測C#中窗體的任何控件的更改?

請指導我。

+0

祝賀錯誤標籤 - 就像您在VB.NET中或在吃披薩時一樣。你談什麼控制? WPF或WinForms? – TomTom 2010-08-26 02:51:49

+0

我的意思是,我需要檢測文本框/組合框/複選框值的變化,如果從先前填充的表單值中檢測到任何更改,則僅禁用按鈕。 – Asad 2010-08-26 02:54:18

+0

該應用程序是使用VS c#.net – Asad 2010-08-26 02:56:26

回答

11

不,我不知道任何事件發生時,只要任何控制窗體的變化。

我的建議是單獨訂閱每個事件(如果您的表單有太多的控件,這實際上很難做到,那麼您可能需要重新考慮你的UI)。

如果你絕對必須訂閱的變化對所有控制,那麼你可能要考慮類似下面的東西:

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

void c_ControlChanged(object sender, EventArgs e) 
{ 

} 

請注意,如果你動態添加這是行不通的特別好但是和在運行時將控件移除到表單。

此外,TextChanged事件可能不適用於某些控件類型(例如TextBoxes) - 在這種情況下,您需要投射並測試控件類型以便能夠訂閱正確的事件,例如:

foreach (Control c in this.Controls) 
{ 
    if (c is CheckBox) 
    { 
     ((CheckBox)c).CheckedChanged += c_ControlChanged; 
    } 
    else 
    { 
     c.TextChanged += new EventHandler(c_ControlChanged); 
    } 
} 
+3

內置的Windows窗體應用程序,您還遇到此方法不處理子控件的問題,例如面板/ flowLayoutPanel/tableLayoutPanel中的文本框等。 – Pondidum 2010-08-26 06:55:12

4

不是直接訪問控件,而是可以綁定到實現INotifyPropertyChanged的模型對象。

每當用戶做了一些事情導致模型中的數據發生變化時,您將會收到通知並可以採取適當的措施。

它可能會減少你需要的值來獲取值進出表單控件。

相關問題