只要对表单内的文本框,combobox等进行任何更改,就会触发事件

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

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

这足以让你盯着看。 您可能需要根据需要为其他control类型添加额外的foreach循环。 好的方面是,每种Control类型只需要几行代码,而不是每个实例,使用这种方法。

 private void addHandlers() { foreach (TextBox control in Controls.OfType()) { control.TextChanged += new EventHandler(OnContentChanged); } foreach (ComboBox control in Controls.OfType()) { control.SelectedIndexChanged += new EventHandler(OnContentChanged); } foreach (CheckBox control in Controls.OfType()) { 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中自动生成事件处理程序(也不应该)。

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