我在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>
型
它工作,但我没有看到基本窗体的控件,这就是为什么我试图通过继承选择器
2条答案
按热度按时间6pp0gazn1#
继承的窗体 * 向导 * 无法在可用的兼容类中显示您的窗体基类,因为派生类需要定义
T
的具体类型;继承选择器没有提供指定这一点的方法。您可以简单地创建一个新的Form,然后更改它继承的Type和基类中定义的泛型类型参数的Type。
例如,创建一个名为
SomeDerivedForm
的表单:字符串
然后将其更改为(
Designer.cs
文件中没有更改):型
自Visual Studio 2015 Update 1(.NET Framework)起,泛型类的设计(不含中间非泛型类)可用
这里介绍的代码中的其他问题,阻止派生类显示添加到基类的控件(或完全功能):
private
,如果需要,应该是internal
或protected internal
InitializeComponent()
方法在您的情况下,可以在以下位置更改代码:
型
在
Designer.cs
文件中,类定义为:型
与派生Form中的初始化序列相关的更多信息:
How to get the size of an inherited Form in the base Form?
np8igboo2#
在VisualStudio中,“继承选择器”对话框可能不会直接显示泛型基窗体。但是,您仍然可以通过修改代码从泛型基窗体手动继承。当您使用“继承选择器”时,它只显示可以直接继承的非泛型基类。
要从泛型基窗体继承,您可以在代码中手动执行,如您所述:
字符串
但是,如果希望泛型基窗体中的控件在派生窗体中可见,则可以执行以下步骤:
1.在设计器中打开您的派生窗体(例如,
Article.cs
)。1.在设计器文件(例如
Article.Designer.cs
)的顶部,添加以下using指令:型
1.在设计器文件中,将窗体的基类更改为泛型基窗体:
型
1.保存并关闭设计器文件。
在进行这些更改之后,派生窗体(
Article
)现在应该继承自通用基窗体(DetailViewBase<Article>
),并且控件在设计器中可见。请记住,如果使用可视设计器进行更改,则手动修改设计器文件可能会导致问题。请务必在进行此类修改之前备份您的文件。