首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在加载期间查找用户控件的ParentForm

在加载期间查找用户控件的ParentForm
EN

Stack Overflow用户
提问于 2016-06-09 14:37:01
回答 1查看 426关注 0票数 1

我正在尝试找到一个用户控件的ParentForm,这样我就可以将一些事件处理程序挂接到它。我尝试在UserControl上的ParentChanged事件处理程序中执行此操作,例如:

代码语言:javascript
复制
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文章建议把东西放在构造器中,但这就是我现在正在做的,而且它不能工作,因为东西被初始化的时间。

有什么想法吗?

EN

回答 1

Stack Overflow用户

发布于 2016-06-09 14:49:36

我在自己的自定义控件中也需要这个。我派生了一个按钮的子类,在onclick中我需要知道表单。所以,诀窍实际上不是让表单加载,而是在需要的时候获得它。

这对我很有效:

代码语言:javascript
复制
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;
}

我是这样使用它的

代码语言:javascript
复制
protected override void OnClick(EvnetArgs e)
{
    Form form = GetParentForm(Parent);
    if (form != null)
    {
        // do stuff here
    }
}
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37718507

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档