0

我正在编写一个程序,其中每个页面都是一个自定义控件。我遇到的问题是我无法让父控件确定子控件何时关闭。这是调用子控件的代码:

    public void DisplayPanel(Control c)
    {
        Cursor = Cursors.WaitCursor;
        c.Dock = DockStyle.Fill;
        c.Show();
        c.ControlRemoved += new ControlEventHandler(OnChildClose);
        this.Controls.Add(c);

        c.BringToFront();
        Cursor = Cursors.Default;
    }

这是事件处理程序:

    public void OnChildClose(object sender, EventArgs e)
    {
        MessageBox.Show("Child closed");
        ... rest of code to redraw listview... 
    }

在子控件上,这就是我退出它的方式:

        this.Parent.Controls.Remove(this);

一切正常,但问题是一旦子控件完成,我需要做一些事情,比如重绘一个列表视图,但上面的事件不会触发。有没有其他方法可以做到这一点?还是我需要以另一种方式继续下去?

当前发生的情况是,例如,我使用子控件将某些内容添加到数据库中,然后退出子控件。子控件消失,父控件留在屏幕上,但父控件没有任何更新。我需要退出父控件并返回查看添加到数据库中

4

2 回答 2

0

在子控件中定义event

public delegate void RemovedEventHandler(object sender, EventArgs e);

class ChildControl
{
    ...

    public event RemovedEventHandler Removed;

    protected virtual void OnRemoved(EventArgs e)
    {
        if (Removed != null)
            Removed(this, e);
    }

    public void Remove(object value) 
    {
       // Before remove from parent call event 
       OnRemoved(EventArgs.Empty);
       //Here remove from parent
       ...
    }
}

它在父控件中的用法:

  ChildControl control = ...
  control.Removed += new EventHandler(ChildRemoved);


  // This will be called whenever the Child Removed:
  private void ChildRemoved(object sender, EventArgs e) 
  {
     ChildControl childControlThatRemoved = (ChildControl) sender;
     Console.WriteLine("This is called when the Child Removed.");
  }
于 2012-07-15T05:32:02.390 回答
0

我很确定通过从父列表中删除孩子,您还会断开所有事件处理程序,因此您不会收到孩子正在关闭的通知(它可能在您从父母列表中删除后被关闭) .

您可以尝试根本不将其从父列表中删除,仅Dispose此而已。或者,由于孩子知道应该刷新父母,让客户端向父母发送一条消息,要求父母刷新自己。这样你就不会依赖任何隐含的东西,并且确切地知道发生了什么。

于 2012-07-15T05:20:30.170 回答