我正在遵循Juan Carlos Diaz here
提供的解决方案我的问题是我没有看到具体类中显示的任何抽象类的表单控件。我期待他们在那里,以便我可以使用具体类的设计编辑器。
以下是我采取的步骤:
AbstractBaseForm.cs
的表单,并添加一些hello world logic:
将abstract
关键字添加到AbstractBaseForm.cs
;你的代码应该是这样的:
public abstract partial class AbstractBaseForm : Form
{
protected AbstractBaseForm()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
label1.Text = "Hello World";
}
}
将以下类添加到项目中:
public class AbstractControlDescriptionProvider<TAbstract, TBase> : TypeDescriptionProvider
{
public AbstractControlDescriptionProvider()
: base(TypeDescriptor.GetProvider(typeof (TAbstract)))
{
}
public override Type GetReflectionType(Type objectType, object instance)
{
if (objectType == typeof (TAbstract))
return typeof (TBase);
return base.GetReflectionType(objectType, instance);
}
public override object CreateInstance(IServiceProvider provider, Type objectType, Type[] argTypes, object[] args)
{
if (objectType == typeof (TAbstract))
objectType = typeof (TBase);
return base.CreateInstance(provider, objectType, argTypes, args);
}
}
将以下属性添加到AbstractBaseForm.cs
:
[TypeDescriptionProvider(typeof (AbstractControlDescriptionProvider<AbstractBaseForm, Form>))]
public abstract partial class AbstractBaseForm : Form
{
在项目中添加第二个表单,标题为ConcreteForm.cs
,并将其继承自AbstractBaseForm.cs
,如下所示:
public partial class ConcreteForm : AbstractBaseForm
{
public ConcreteForm()
{
InitializeComponent();
}
}
更改program.cs,以便加载ConcreteForm.cs
,如下所示:
Application.Run(new ConcreteForm());
执行项目。您应该看到ConcreteForm.cs
加载,然后单击按钮将标签更改为“Hello World”。
关闭应用程序,然后单击ConcreteForm.cs
,打开其设计视图。你会看到:
为什么我在设计视图中看不到来自AbstractBaseForm.cs
的继承控件?
答案 0 :(得分:2)
添加对基础构造函数的调用
public partial class ConcreteForm : AbstractBaseForm
{
public ConcreteForm() : base()
{
InitializeComponent();
}
}
正如@ hans-passant建议的那样,删除abstract关键字。使用abstract关键字后,我收到以下错误:
设计者必须创建一个类型的实例 'WindowsFormsApplication1.Form1',但它不能因为类型 宣称为抽象。