代码之家  ›  专栏  ›  技术社区  ›  DRapp

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

  •  0
  • DRapp  · 技术社区  · 16 年前

    我正在尝试用VisualFoxPro(VFP)做一些我以前可以做的事情。通过使用“setall()”函数,我可以做一些类似于当前窗体的事情…this.setall(“someProperty”,“tosomeNewValue”)并将值传递给所有控件。通过创建我自己的自定义属性和通过“_assign”在vfp内部创建,将导致触发这些事件。从该方法中,每个控件将根据我在每个单独控件中放置的内容,从启用/禁用/可见性、可编辑、只读、颜色、字体、验证等方面对窗体进行自我管理。

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

    谢谢

    2 回复  |  直到 16 年前
        1
  •  1
  •   RossFabricant    16 年前

    我会这样做:

    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);
                                          });
    }
    

    为了得到前臂,你需要这样的东西:

      public static class Extensions
      {
        public static void ForEach<T>(this IEnumerable source, Action<T> action)
        {
          foreach (var item in source)
          {
            action((T)item);
          }
        }
      }
    
        2
  •  0
  •   DRapp    16 年前

    实际上,我通过在表单的initialzecomponents()调用结束时自注册每个控件以及在我的研究中阅读的其他部分的组合来解决这个问题。

    在构建基线表单、文本框、标签控件(以及其他控件)之后,在InitializeComponents()之后,我对表单上的每个控件进行递归调用,并将其方法注册到表单的委托/事件中。然后,在调用以更改表单的编辑模式期间,它调用委托调用并触发每个单独的控件函数。所以,我可以更好地处理委托/事件处理,现在是递归调用。这是预先完成的,所以我不必在按钮单击期间保持递归检查和调用,也不必在每次需要执行某项操作时循环使用其他条件。