在Designer中不能使用的通用表单的具体实现

时间:2009-05-15 17:30:38

标签: c# generics visual-studio-2005 windows-forms-designer

我有一个基类,定义如下(我也使用DevExpress组件):

public abstract partial class BaseFormClass<R> : XtraForm where R : DataRow
{
  ...
}

与我从其他地方读到的内容相反,我仍然能够设计这门课程。我没有必要从中创建一个具体的类。但是,当我创建一个来自它的具体类(如下所示)时,该类将无法在设计器中工作。

public partial class ConcreteFormClass : BaseFormClass<StronglyTypedRow>
{
  ...
}

我收到此消息:

  

无法展示设计师   这个文件因为没有类   在其中可以设计。该   设计师检查了以下内容   文件中的类:   ConcreteFormClass ---基础   类   'BaseFormClass'   无法加载。确保   已经引用了程序集   所有项目都已建成。

有没有人见过这个?任何已知的解决方法?

2 个答案:

答案 0 :(得分:4)

很抱歉,但这不会起作用(这是一种耻辱 - 我过去曾希望你能做到这一点。)问题是设计师的基本方法。

为了向您展示您的表单模型,它实际上并不尝试构建表单本身;如果它这样做,你会遇到其他问题 - 如果你的表单没有无参数构造函数怎么办?相反,它实际上实例化了表单基类的实例。然后,它会扫描您的InitializeComponents()方法,并将您在其中定义的所有控件“叠加到”基础表单上。

所以很明显为什么这不起作用。您可以设计BaseFormClass的实例,因为要设计它,它会创建一个XtraForm的实例,这是具体的。但是你不能设计ConcreteFormClass的实例,因为要这样做,它需要创建一个BaseFormClass的实例,它是抽象的。

最简单的解决方法是让BaseFormClass非抽象。 (如果你想绝对确定没有人可以创建一个,也许你可以将默认构造函数设为私有?我不确定设计师是否可以处理它,但我不明白为什么它不能。)糟透了,但是这就是人生。抱怨微软,也许它在Visual Studio 2012中会更好。

答案 1 :(得分:0)

这听起来像是一个非常类似的问题,让设计师渲染具有抽象基类的表单。我没有做任何通用的多重继承,但你至少可以尝试my approach并查看它是否有效。

编辑:是的,好的,只是尝试过,我的解决方案确实有效。您只需修改中间类定义和表单定义(包含在#if DEBUG

如果你能尝试的话,请告诉我!