我正在使用 C# WinForm。它有十几个文本框、组合框和复选框。winform 显示从数据库中检索到的信息。表单上有一个已禁用的保存按钮。我希望能够在更改任何文本框/组合框/复选框时启用它。
有没有一种简单的方法可以做到这一点,而无需为每个项目添加单独的事件处理程序?
这里足以让你目瞪口呆。您可能需要根据需要为其他类型添加额外的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
事件,以便在表单上的某些内容发生更改时执行任何可能需要发生的事情(即启用/禁用保存按钮)。
您必须通过控件并将更改事件附加到每个控件。本文讨论了类似的情况。
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);
}
}
您可以编写一个通用的事件处理程序来处理所有事件的事件,但是唉,不,没有办法在 Visual Studio 中自动生成事件处理程序(也不应该有)。
您可以将所有事件连接到一个处理程序,只需让它们都调用相同的函数,您有一个布尔标志 mbSomethingChanged = true 并启用保存按钮。如果要提醒用户保存,请检查表单关闭上的标志。