我正在尝试找到一个用户控件的ParentForm,这样我就可以将一些事件处理程序挂接到它。我尝试在UserControl上的ParentChanged事件处理程序中执行此操作,例如:
ParentChanged += delegate(object sender, EventArgs args)
{
ParentForm.SomeEvent += ...
}如果UserControl的父级恰好是表单,则可以很好地执行此操作。但是,如果UserControl嵌入在容器控件(在本例中为SplitContainer)中,则在将容器控件添加到顶级窗体的控件(如InitializeComponent方法中控制的控件)之前,会将UserControl添加到容器控件中。也就是说,InitializeComponent()从树叶向上构建层次,所以树叶不知道它们在构造过程中最终会被放置在什么形式上。
因此,当触发ParentChanged事件时,UserControl上的ParentForm为空,并且当UserControl父控件的父级发生更改时,我不会获得ParentChanged事件。我可以为父级的ParentChanged事件添加侦听器,但我必须在整个控件层次结构中执行此操作,这并不是特别优雅。
基本上,我希望在UserControl的ParentForm发生更改时得到通知。然而,没有这样的事件。我可以连接到Load事件之类的东西,但是this说,如果控件在MDI容器中,那么每次显示控件时,它都会被触发。那篇MSDN文章建议把东西放在构造器中,但这就是我现在正在做的,而且它不能工作,因为东西被初始化的时间。
有什么想法吗?
发布于 2016-06-09 14:49:36
我在自己的自定义控件中也需要这个。我派生了一个按钮的子类,在onclick中我需要知道表单。所以,诀窍实际上不是让表单加载,而是在需要的时候获得它。
这对我很有效:
private Form GetParentForm(Control parent)
{
Form Result = parent as Form;
if (Result == null)
{
if (parent != null)
{
// Recursive is cool
return GetParentForm(parent.Parent);
}
}
return Result;
}我是这样使用它的
protected override void OnClick(EvnetArgs e)
{
Form form = GetParentForm(Parent);
if (form != null)
{
// do stuff here
}
}https://stackoverflow.com/questions/37718507
复制相似问题