1

我想编写一个只能有父类型Form(或派生类)的控件。

我猜您可能会将这种行为比作TabControl, or TabPage,其中 aTabControl不能有非类型的子级TabPageTabPage也不能有非 a 的父级TabControl

但是我的实现略有不同,因为与 不同TabControl,我希望我Form接受任何类型的控件,但我的控件应该只有一个类型的父级Form

这是我尝试过的:

public class CustomControl : ContainerControl
{
    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);
        if (!(this.Parent is Form))
        {
            this.Parent.Controls.Remove(this);
            throw new ArgumentException("CustomControl can only be a child of Form");
        }
    }
}

这会在表单设计器中导致一些不良影响,例如:

  1. 尝试在设计器中加载表单时引发异常。
  2. 从窗体中删除控件时引发异常。
  3. 控件未正确调整大小。

我将不胜感激有关如何解决此问题的任何建议,或者指出我哪里出错了。

4

1 回答 1

0

正如人们常说的,最简单的答案往往是最好的……在if语句中添加一个额外的检查可以解决所有问题!- 傻我!我应该早点尝试这个!

public class CustomControl : ContainerControl
{
    protected override void OnParentChanged(EventArgs e)
    {
        base.OnParentChanged(e);
        if (this.Parent != null && !(this.Parent is Form))
        {
            this.Parent.Controls.Remove(this);
            throw new ArgumentException("CustomControl can only be a child of Form");
        }
    }
}
于 2013-04-18T14:43:16.390 回答