在使用.net的Windows窗体中将控件's父控件约束为特定类型

本文关键字:控件 约束 类型 net Windows 窗体 | 更新日期: 2023-09-27 18:09:46

我想写一个控件,它只能有一个类型为Form(或衍生)的父控件。

我猜你可能会把这种行为比作TabControl,或TabPage,其中TabControl不能有不是TabPage类型的孩子,TabPage不能有一个不是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. 控件没有正确调整大小。

我很感激任何关于如何解决这个问题的建议,或者我在哪里出错了。

在使用.net的Windows窗体中将控件's父控件约束为特定类型

正如人们常说的,最简单的答案往往是最好的……向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");
        }
    }
}