我正在编写一个程序,其中每个页面都是自定义控件。我遇到的问题是我无法让父控件确定子控件何时关闭。这是调用子控件的代码:
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的事情,但上面的事件不会触发。有没有其他方法这样做?还是我需要以另一种方式继续下去?
目前发生的事情是,例如,我使用子控件向数据库添加内容,然后退出子项。子控件消失,父节点保留在屏幕上,但父节点上没有更新任何内容。我需要退出父控件并返回查看数据库的添加
答案 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.");
}