如何通知子控件父控件的变化

4

如何使子控件随父控件的更改而更新呢?

我有一些子控件托管在我的父对象中,我能够想到两种方法向它们发送更改信息:

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

}
  }

The child...

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个回答

5
您的最佳解决方案是最好的选择,因为它允许您在不更改父级的情况下改变实现。由于父级可以说并不关心是否有子级,所以基于事件的方法是理想的。
更新:
反向事件方法是不诚实的。人们声称父级清楚地知道孩子对他们感兴趣,而我则不同意这种说法。我的设计通常是子级动态地对父级感兴趣,并且子级订阅事件通常是最有利的方式。
您可以在.NET模型中找到这样的例子,例如Page具有可以连接的事件。

2

在这里,事件不是正确的选择。父控件从来没有问题找出需要通知的子控件。只需在UC中添加一个公共方法,如UpdateMessage()。父控件可以直接调用它们。

保留事件,以便在您不知道听众可能感兴趣的内容时通知听众。像您正在考虑的“反向事件”一样是不健康的,因为它会在窗体上保留引用。窗体不应被引用,因此当其关闭时可以进行垃圾回收。虽然该引用由子控件持有,但原则仍然适用。


我同意。由于父对象知道它拥有哪些子对象,因此应该直接调用这些子对象的公共方法。 - 300 baud

0

事件机制是这类任务的常见例程。它比您的第二个解决方案更加灵活。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接