如何检测表单的任何控件的变化?

Asa*_*sad 7 c# winforms

如何在C#中检测表单控件中的更改?

因为我在一个表单上有很多控件,如果表单中的任何控件值发生变化,我需要禁用一个按钮.我正在寻找一些内置的函数/事件处理程序/属性,并且不想为此创建自定义函数.

Jus*_*tin 14

不,我不知道任何对表单的任何控制发生变化时都会触发的事件.

我的建议是单独订阅每个事件(如果你的表单有很多控件,这实际上很难做,那么你可能想重新考虑你的UI).

如果您绝对必须订阅所有控件的更改,那么您可能需要考虑类似于以下内容:

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

void c_ControlChanged(object sender, EventArgs e)
{

}
Run Code Online (Sandbox Code Playgroud)

请注意,如果您在运行时动态添加和删除窗体的控件,这将无法正常工作.

此外,TextChanged对于某些控件类型(例如TextBoxes),事件可能不是合适的事件 - 在这种情况下,您需要转换和测试控件类型,以便能够订阅正确的事件,例如:

foreach (Control c in this.Controls)
{
    if (c is CheckBox)
    {
        ((CheckBox)c).CheckedChanged += c_ControlChanged;
    }
    else
    {
        c.TextChanged += new EventHandler(c_ControlChanged);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你也遇到了这个方法不处理子控件的问题,比如面板/ flowLayoutPanel/tableLayoutPanel等中的文本框. (5认同)

And*_*nan 5

您可以直接将数据绑定到实现INotifyPropertyChanged的模型对象,而不是直接访问控件.

每当用户执行某些操作导致模型中的数据发生更改时,您将收到通知,并可采取相应的操作.

它可能还会减少在表单控件中输入和输出值所需的代码量.