5

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

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

4

4 回答 4

5

这里足以让你目瞪口呆。您可能需要根据需要为其他类型添加额外的foreach循环。好处是,使用这种方法,您只需要为每种类型而不是每个实例control编写几行代码。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;

在修改addHandlers方法以支持所有控件并在将所有控件添加到表单后调用它之后,您可以简单地订阅ContentChanged事件,以便在表单上的某些内容发生更改时执行任何可能需要发生的事情(即启用/禁用保存按钮)。

于 2012-07-12T16:30:35.863 回答
2

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

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);
      }
  }
于 2012-07-12T16:31:51.653 回答
0

您可以编写一个通用的事件处理程序来处理所有事件的事件,但是唉,不,没有办法在 Visual Studio 中自动生成事件处理程序(也不应该有)。

于 2012-07-12T16:28:04.227 回答
0

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

于 2012-07-12T16:28:25.040 回答