泛型窗体继承时不能在设计器中显示,为神马?

今天遇到一奇怪的问题,自己搞了2个小时没有弄好。到Stack Overflow发了个帖子提问,顺便把问题也贴到博客里,如有人看到请帮忙。如果问题解决了,我会把问题的原因和解决方案放到这里来。

I meet a problem today. As following.
I create a generic Form , 
public class Form1<T>:Form
Then I create another inheritance form, 
public class From2:Form1<string>.
The form2 cannot be shown in the VS designer, the error message is  "all the classes in the file cannot be designed", (this error message is translated from Chinese, the Chinese message is 文件中的类都不能进行设计).
But this program can be compiled successfully, and when it runs, both Form1 and From2 can work.

 

Anyone can give me some help about this ? Thanks.

I am not a native English speaker, I hope I have described my question clear.

----------------------------------------------

Stack Overflow果然是个好的编程网站,人气旺,水平高。5分钟后已经找到答案了。

以下为答案(原文 地址http://adamhouldsworth.blogspot.com/2010/02/winforms-visual-inheritance-limitations.html)

I have a small personal project going that involves a WinForms GUI.  I have a series of data listing and editing user controls that I decided to refactor.  There were 5 of each, and out of each they used roughly 80%-90% of the same code, just with naming changes.

A fantastic case of "same whitespace, different values" .  I read this a long time ago, but for some reason it stuck.

Supporting Generics

My first port of call was a base class for each of the two user controls.  However, I wanted to migrate even logic involving the business class to the base class, which involved knowing about the business class type.

Step in: Generics.

Step in: first problem .

Using generics causes the designer interface in Visual Studio to crash, as it breaks one of the rules about knowing the base class type.  Microsoft explicitly say generics are not supported.  Fair enough.

The workaround for this (as specified in the previous link) is to create a concrete implementation of the generic base class using a dummy intermediary:

- BaseControl<T> : UserControl
- CustomerControl_Design : BaseControl<Customer>
- CustomerControl : CustomerControl_Design

The CustomerControl_Design class will not have any designer support, and you shouldn't actually need it.  But, your CustomerControl class now does - the peasents rejoice.

I've wrapped the code in compiler tags, so that when it doesn't need design-time support, superfluous code is cut:

#if

DEBUG

namespace

MyNamespace

{

    using
System;

    public
partial
class
CustomerEditorControl_Design
: BaseEditorControl<Customer>

   {

       public
CustomerEditorControl_Design()      : base
()

        {

            InitializeComponent();
        }

    }

}

#endif

public

partial
class
CustomerEditorControl
#if

DEBUG  : CustomerEditorControl_Design
#else

  : BaseEditorControl<Customer>
#endif

    { ...  }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值