来自抽象base-Form的控件在子表单

时间:2015-06-29 20:45:48

标签: c# winforms inheritance abstract

我正在遵循Juan Carlos Diaz here

提供的解决方案

我的问题是我没有看到具体类中显示的任何抽象类的表单控件。我期待他们在那里,以便我可以使用具体类的设计编辑器。

以下是我采取的步骤:

  1. 创建新解决方案
  2. 创建一个新的winforms项目(.Net 4.5.2)
  3. 创建一个标题为AbstractBaseForm.cs的表单,并添加一些hello world logic:
  4. enter image description here

    1. abstract关键字添加到AbstractBaseForm.cs;你的代码应该是这样的:

      public abstract partial class AbstractBaseForm : Form
      {
          protected AbstractBaseForm()
          {
              InitializeComponent();
          }
      
          private void button1_Click(object sender, EventArgs e)
          {
              label1.Text = "Hello World";
          }
      }
      
    2. 将以下类添加到项目中:

      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);
          }
      }
      
    3. 将以下属性添加到AbstractBaseForm.cs

      [TypeDescriptionProvider(typeof (AbstractControlDescriptionProvider<AbstractBaseForm, Form>))]
      public abstract partial class AbstractBaseForm : Form
      {
      
    4. 在项目中添加第二个表单,标题为ConcreteForm.cs,并将其继承自AbstractBaseForm.cs,如下所示:

      public partial class ConcreteForm : AbstractBaseForm
      {
          public ConcreteForm()
          {
               InitializeComponent();
          }
      }
      
    5. 更改program.cs,以便加载ConcreteForm.cs,如下所示:

      Application.Run(new ConcreteForm());
      
    6. 执行项目。您应该看到ConcreteForm.cs加载,然后单击按钮将标签更改为“Hello World”。

    7. 关闭应用程序,然后单击ConcreteForm.cs,打开其设计视图。你会看到:

    8. enter image description here

      为什么我在设计视图中看不到来自AbstractBaseForm.cs的继承控件?

1 个答案:

答案 0 :(得分:2)

添加对基础构造函数的调用

public partial class ConcreteForm : AbstractBaseForm
{
    public ConcreteForm() : base()
    {
         InitializeComponent();
    }
}

正如@ hans-passant建议的那样,删除abstract关键字。使用abstract关键字后,我收到以下错误:

  

设计者必须创建一个类型的实例   'WindowsFormsApplication1.Form1',但它不能因为类型   宣称为抽象。