1

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

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

与我从其他地方读到的相反,我仍然能够设计这个类。我不必为此创建一个具体的类。但是,当我创建一个派生自它的具体类时(如下所示),该类在设计器中不起作用。

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

我收到这条消息:

无法为此文件显示设计器,因为无法设计其中的任何类。设计人员检查了文件中的以下类: ConcreteFormClass --- 无法加载基类“BaseFormClass”。确保已引用程序集并且已构建所有项目。

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

4

2 回答 2

4

抱歉,但这行不通(真遗憾——我过去希望你也可以这样做。)问题在于设计者的基本方法。

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

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

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

于 2009-05-15T17:36:05.123 回答
0

这听起来与让设计人员渲染具有抽象基类的表单非常相似。我没有做过任何通用的多继承,但你至少可以试试我的方法,看看它是否有效。

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

让我知道你是否可以尝试!

于 2010-03-09T06:51:42.533 回答