2010-08-26 109 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的模型对象。

每当用户做了一些事情导致模型中的数据发生变化时,您将会收到通知并可以采取适当的措施。

它可能会减少你需要的值来获取值进出表单控件。

相关问题