winforms “继承选择器”列表中未显示通用基窗体

knpiaxh1  于 2023-08-07  发布在  其他
关注(0)|答案(2)|浏览(149)

我在VS 2022中有一个基本表单:

public partial class DetailViewBase<TEntity> : Form
    where TEntity : class, new()
{
    // For Designer
    private DetailViewBase()
    {
    }

    public DetailViewBase(int? id)
    {
      Id = id;
    }
    ...
}

字符串
当我尝试创建一个应该从基窗体继承的新窗体时(添加->新项->继承的窗体),基窗体没有显示在“继承选择器”中。如果没有泛型,则显示。难道不能继承吗?当我只是像这样把我的其他形式建立在基本形式的基础上

public partial class Article : DetailViewBase<Article>


它工作,但我没有看到基本窗体的控件,这就是为什么我试图通过继承选择器

6pp0gazn

6pp0gazn1#

继承的窗体 * 向导 * 无法在可用的兼容类中显示您的窗体基类,因为派生类需要定义T的具体类型;继承选择器没有提供指定这一点的方法。
您可以简单地创建一个新的Form,然后更改它继承的Type和基类中定义的泛型类型参数的Type。
例如,创建一个名为SomeDerivedForm的表单:

public partial class SomeDerivedForm : Form {
    public SomeDerivedForm() => InitializeComponent();
}

字符串
然后将其更改为(Designer.cs文件中没有更改):

public partial class SomeDerivedForm : SomeBaseForm<SomeType> {
    public SomeDerivedForm() => InitializeComponent();
}


自Visual Studio 2015 Update 1(.NET Framework)起,泛型类的设计(不含中间非泛型类)可用
这里介绍的代码中的其他问题,阻止派生类显示添加到基类的控件(或完全功能):

  • 默认的构造函数不应该是private,如果需要,应该是internalprotected internal
  • 当然,默认构造函数必须调用InitializeComponent()方法
  • 重载的构造函数应首先调用默认构造函数

在您的情况下,可以在以下位置更改代码:

public partial class DetailViewBase<TEntity> : Form where TEntity : class, new()
{
    internal DetailViewBase() => InitializeComponent();

    public DetailViewBase(int? id) : this() {
      Id = id;
    }

    // [...]
}


Designer.cs文件中,类定义为:

partial class DetailViewBase<TEntity> { //[...] }


与派生Form中的初始化序列相关的更多信息:
How to get the size of an inherited Form in the base Form?

np8igboo

np8igboo2#

在VisualStudio中,“继承选择器”对话框可能不会直接显示泛型基窗体。但是,您仍然可以通过修改代码从泛型基窗体手动继承。当您使用“继承选择器”时,它只显示可以直接继承的非泛型基类。
要从泛型基窗体继承,您可以在代码中手动执行,如您所述:

public partial class Article : DetailViewBase<Article>
{
    // Your form code here
}

字符串
但是,如果希望泛型基窗体中的控件在派生窗体中可见,则可以执行以下步骤:
1.在设计器中打开您的派生窗体(例如,Article.cs)。
1.在设计器文件(例如Article.Designer.cs)的顶部,添加以下using指令:

using YourNamespaceToDetailViewBase;


1.在设计器文件中,将窗体的基类更改为泛型基窗体:

public partial class Article : DetailViewBase<Article>
{
    // Form code here
}


1.保存并关闭设计器文件。
在进行这些更改之后,派生窗体(Article)现在应该继承自通用基窗体(DetailViewBase<Article>),并且控件在设计器中可见。
请记住,如果使用可视设计器进行更改,则手动修改设计器文件可能会导致问题。请务必在进行此类修改之前备份您的文件。

相关问题