如何确定子控件何时关闭

时间:2012-07-15 05:18:06

标签: c# events custom-controls

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

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

一切正常,但问题是,一旦子控件完成,我需要做重绘listview的事情,但上面的事件不会触发。有没有其他方法这样做?还是我需要以另一种方式继续下去?

目前发生的事情是,例如,我使用子控件向数据库添加内容,然后退出子项。子控件消失,父节点保留在屏幕上,但父节点上没有更新任何内容。我需要退出父控件并返回查看数据库的添加

2 个答案:

答案 0 :(得分:0)

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

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

答案 1 :(得分: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.");
  }