2012-07-12 20 views
5

我正在使用C#WinForm。它有十几个文本框,组合框和复选框。 winform显示从数据库中检索的信息。窗体上有一个保存按钮被禁用。我希望能够在任何文本框/组合框/复选框发生更改时启用它。发生任何事件时发生任何文本框,组合框等内部形式的变化

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

+0

可能重复的[如何检测C#中窗体的任何控件的变化?](http://stackoverflow.com/questions/3571722/how-to-detect-changes-in-any-control -of-the-form-in-c) – 2012-07-12 16:27:42

+0

这样编程没有意义。如果用户检查某些内容,然后再次取消选中,您是否打算再次禁用该按钮?毕竟,没有任何改变。 – LarsTech 2012-07-12 16:29:21

回答

5

这足以让你盯紧。根据需要,您可能需要为其他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事件做任何可能需要对随时发生的事表单改变(即启用/禁用保存按钮)。

+0

+1为目前为止的最佳答案 – 2012-07-12 16:35:16

0

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

0

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

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); 
     } 
    } 
相关问题