委托对价值/财产变更进行控制

时间:2009-03-19 00:32:30

标签: c# delegates

我正在尝试做一些我历史上可以使用Visual FoxPro(VFP)做的事情。通过使用“SETALL()”函数,我能够执行类似于当前表单... this.SetAll(“someProperty”,“toSomeNewValue”)的操作,并且它会通过并将值分配给所有控件。通过“_assign”创建自己的自定义属性和VFP内部,将导致触发这些事件。从THAT方法开始,每个控件都会在表单上自行处理,从启用/禁用/可见性,可编辑,只读,颜色,字体,验证等,基于我在每个单独控件中放置的内容。

那么,我将如何在C#中执行类似的操作...例如在表单级别具有公共属性,方法或委托,例如“FormEditMode”。然后,当我执行类似this.FormEditMode = AddMode之类的操作时,所有控件都将被自动触发以打开/关闭,分别启用/禁用而不是显式调用给定表单上的所有控件。

由于

2 个答案:

答案 0 :(得分:1)

我会做这样的事情:

this.Visible = false;
Controls.ForEach<Control>(c => c.Visible = false);

如果您有GroupBox或其他具有控件的控件,您可能希望将其放入递归函数中:

static void DoForEachControl(Control control, Action<Control> f)
{
  control.Controls.ForEach<Control>(c =>
                                      {
                                        f(c);
                                        DoForEachControl(c, f);
                                      });
}

要获得ForEach,你需要这样的东西:

  public static class Extensions
  {
    public static void ForEach<T>(this IEnumerable source, Action<T> action)
    {
      foreach (var item in source)
      {
        action((T)item);
      }
    }
  }

答案 1 :(得分:0)

我实际上是通过让每个控件在表单的InitialzeComponents()调用结束时自行注册,以及我在研究中为解决方案阅读的其他部分的组合来解决它。

在构建我的基线表单,文本框,标签控件(和其他)之后,在InitializeComponents()之后,我对表单上的每个控件进行递归调用,并将其方法注册到表单的委托/事件。然后,在调用更改表单的编辑模式的过程中,它会调用委托调用并触发每个单独的控件功能。所以,我正在更好地处理委托/事件处理,现在是递归调用。这是在前面完成的,因此我不必在按钮单击期间递归检查和调用,或者在我每次需要执行某些操作时循环控制的其他条件。