我正在使用C#WinForm。它有十几个文本框,组合框和复选框。 winform显示从数据库中检索的信息。窗体上有一个保存按钮被禁用。我希望能够在任何文本框/组合框/复选框发生更改时启用它。发生任何事件时发生任何文本框,组合框等内部形式的变化
有没有一种简单的方法可以做到这一点,而无需向这些项目添加单独的事件处理程序?
我正在使用C#WinForm。它有十几个文本框,组合框和复选框。 winform显示从数据库中检索的信息。窗体上有一个保存按钮被禁用。我希望能够在任何文本框/组合框/复选框发生更改时启用它。发生任何事件时发生任何文本框,组合框等内部形式的变化
有没有一种简单的方法可以做到这一点,而无需向这些项目添加单独的事件处理程序?
这足以让你盯紧。根据需要,您可能需要为其他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
事件做任何可能需要对随时发生的事表单改变(即启用/禁用保存按钮)。
+1为目前为止的最佳答案 – 2012-07-12 16:35:16
您可以编写一个通用事件处理程序来处理所有这些事件的事件,但是,唉,没有办法在Visual Studio中自动生成事件处理程序(也不应该有)。
您可以将所有事件连接到一个处理程序,只需让它们都调用相同的函数,然后您就可以使用bool标志mbSomethingChanged = true并启用保存按钮。如果要提醒用户保存,请检查窗体上的标志关闭。
您必须通过控件并将更改事件附加到每个控件。这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);
}
}
可能重复的[如何检测C#中窗体的任何控件的变化?](http://stackoverflow.com/questions/3571722/how-to-detect-changes-in-any-control -of-the-form-in-c) – 2012-07-12 16:27:42
这样编程没有意义。如果用户检查某些内容,然后再次取消选中,您是否打算再次禁用该按钮?毕竟,没有任何改变。 – LarsTech 2012-07-12 16:29:21