【问题标题】:Have event fire whenever any changes made to textboxes, comboboxs, etc. inside form每当对表单内的文本框、组合框等进行任何更改时都会触发事件
【发布时间】:2012-07-12 16:22:41
【问题描述】:

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

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

【问题讨论】:

标签: c# winforms events


【解决方案1】:

这里足以让你目瞪口呆。您可能需要根据需要为其他 control 类型添加额外的 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;

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

【讨论】:

    【解决方案2】:

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

    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);
          }
      }
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-10-09
          • 1970-01-01
          • 2020-09-08
          • 2021-12-29
          • 1970-01-01
          • 1970-01-01
          • 2019-05-01
          • 1970-01-01
          相关资源
          最近更新 更多