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

如何将父控件中的更改通知子控件

c#
  •  4
  • fishhead  · 技术社区  · 16 年前

    对于父控件中的更改,使子控件保持最新的最佳方法是什么?

    我在父对象中托管了许多子控件,我可以想出两种方法来向它们发送更改信息。

    1)将子控件连接到父控件中的事件,并在父控件中发生更改时触发该事件

    2)在数组中保留子数组的列表,并在发生更改时遍历数组,并调用子数组中的方法来处理新的更改。

    我希望我能描述得很好。

    两者都有效,但可能有正确的方法来处理这个问题,也有错误的方法。

    编辑: 下面是我的代码…用于事件方法。我对我把孩子和父母联系在一起的方式不满意;任何暗示。

    父母…

    public  class A_Parent       
    {
    
     public delegate void DelUpdateMessage(  string msg );
    
    public event DelUpdateMessage UpdateMessage;
    public A_Parent()
    {
      a_Child1.prnt = this;
      a_Child2.prnt = this;
      a_Child3.prnt = this;
      a_Child4.prnt = this;
    }
    
    private void FireUpdateMessageEvent(  string message)
    {
      var handlers = UpdateMessage;
    
      if (handlers != null)
        handlers(  message );
    
    }
      }
    

    孩子…

    public  class A_Child        
        {
        A_Parent pnt;
        public A_Parent prnt
        {
         set
           {
            pnt = value;
            pnt.UpdateMessage += new A_Parent.DelUpdateMessage(pnt_UpdateMessage);
            }
         }
    
    
    void pnt_UpdateMessage(string msg)  {      }
    
    }
    
    3 回复  |  直到 16 年前
        1
  •  5
  •   JustLoren    16 年前

    你的1解决方案是最好的选择,因为它允许你在不改变父级的情况下改变实现。因为父母可以说不在乎自己是否有孩子,所以基于事件的方法是理想的。

    更新

    反向事件方法是不真诚的。人们说父母清楚地知道孩子们对他们感兴趣,我只是不同意这种说法。我的设计通常会让孩子们对父母产生动态的兴趣,而订阅活动的孩子通常是最有利的方式。

    您可以在.NET模型中找到此类示例,例如包含可绑定到的事件的页面。

        2
  •  2
  •   Hans Passant    16 年前

    在这里,事件不是正确的选择。父控件永远不会有问题,知道需要通知哪些子控件。只需向uc添加一个公共方法,比如updateMessage()。家长可以直接给他们打电话。

    保留事件,以便在不知道哪些侦听器可能感兴趣时通知侦听器。有一个像你正在思考的“逆向事件”是不健康的,它会在表单上保留一个引用。表单不应该被引用,这样当它关闭时就可以得到垃圾回收。这在这里不是一个真正的问题,因为引用是由子控件持有的,但原则是成立的。

        3
  •  0
  •   n535    16 年前

    事件机制是此类任务的常见例程。它将比你的第二个解决方案灵活得多。