C# 无论何时对表单内的文本框、组合框等进行任何更改,都要触发事件

C# 无论何时对表单内的文本框、组合框等进行任何更改,都要触发事件,c#,winforms,events,C#,Winforms,Events,我在和一个C#WinForm合作。它有十几个文本框、组合框和复选框。winform显示从数据库检索的信息。表单上有一个已禁用的保存按钮。我希望能够在任何文本框/组合框/复选框更改时启用它 有没有一种简单的方法可以做到这一点,而无需向每个项目添加单独的事件处理程序?您可以编写一个通用事件处理程序来处理所有项目的事件,但遗憾的是,没有,在Visual Studio中无法自动生成事件处理程序(也不应该有这样的方法).您可以将所有事件连接到一个处理程序,只需让它们都调用同一个函数,就可以使用bool标志

我在和一个C#WinForm合作。它有十几个文本框、组合框和复选框。winform显示从数据库检索的信息。表单上有一个已禁用的保存按钮。我希望能够在任何文本框/组合框/复选框更改时启用它


有没有一种简单的方法可以做到这一点,而无需向每个项目添加单独的事件处理程序?

您可以编写一个通用事件处理程序来处理所有项目的事件,但遗憾的是,没有,在Visual Studio中无法自动生成事件处理程序(也不应该有这样的方法).

您可以将所有事件连接到一个处理程序,只需让它们都调用同一个函数,就可以使用bool标志mbSomethingChanged=true并启用保存按钮。如果您想提醒用户保存,请选中表单关闭上的标志。

这里足以让您目瞪口呆。您可能需要根据需要为其他
控件
类型添加额外的
foreach
循环。很好的一点是,使用这种方法,每个
Control
类型只需要几行代码,而不是每个实例

private void addHandlers()
{
    foreach (TextBox control in Controls.OfType<TextBox>())
    {
        control.TextChanged += new EventHandler(OnContentChanged);
    }
    foreach (ComboBox control in Controls.OfType<ComboBox>())
    {
        control.SelectedIndexChanged += new EventHandler(OnContentChanged);
    }
    foreach (CheckBox control in Controls.OfType<CheckBox>())
    {
        control.CheckedChanged += new EventHandler(OnContentChanged);
    }
}

protected void OnContentChanged(object sender, EventArgs e)
{
    if (ContentChanged != null)
        ContentChanged(this, new EventArgs());
}

public event EventHandler ContentChanged;
private void addHandlers()
{
foreach(Controls.OfType()中的TextBox控件)
{
control.TextChanged+=新事件处理程序(OnContentChanged);
}
foreach(Controls.OfType()中的ComboBox控件)
{
control.SelectedIndexChanged+=新事件处理程序(OnContentChanged);
}
foreach(Controls.OfType()中的复选框控件)
{
control.CheckedChanged+=新事件处理程序(OnContentChanged);
}
}
受保护的void OnContentChanged(对象发送方,事件参数e)
{
if(ContentChanged!=null)
ContentChanged(这是新的EventArgs());
}
公共事件事件处理程序内容已更改;

修改
addHandlers
方法以支持所有控件,并在将所有控件添加到表单后调用该方法后,您只需订阅
ContentChanged
事件,以便在表单上发生更改时执行任何可能需要执行的操作(即启用/禁用保存按钮).

您必须遍历控件并将更改事件附加到每个控件。本文将讨论类似的情况

private void AssignHandlersForControlCollection(
       Control.ControlCollection coll)
  {
      foreach (Control c in coll)
      {
          if (c is TextBox)
              (c as TextBox).TextChanged 
                += new EventHandler(SimpleDirtyTracker_TextChanged);

          if (c is CheckBox)
              (c as CheckBox).CheckedChanged 
                += new EventHandler(SimpleDirtyTracker_CheckedChanged);

          // ... apply for other desired input types similarly ...

          // recurively apply to inner collections
          if (c.HasChildren)
              AssignHandlersForControlCollection(c.Controls);
      }
  }

它的可能复制品以这种方式编程是没有意义的。如果用户检查了某些内容,然后再次取消选中,您是否计划再次禁用该按钮?毕竟,一切都没有改变。