WinForm UserControl的通用基类

时间:2009-03-24 14:18:39

标签: c# winforms visual-studio-2008

我为WinForm UserControl创建了一个通用基类:

public partial class BaseUserControl<T> : UserControl
{
    public virtual void MyMethod<T>() 
    { 
        // some base stuff here 
    }
}

基于以下内容的UserControl:

public partial class MyControl : BaseUserControl<SomeClass>
{
    public override void MyMethod<SomeClass>() 
    { 
        // some specific stuff here 
        base.MyMethod<SomeClass>();
    }
}

它工作正常,但MyControl无法在VisualStudio Designer中编辑,因为它说它无法加载基类。 我试图定义另一个类BaseUserControl,非泛型,希望它会加载它,但这个技巧似乎不起作用。

我已经有了一个解决方法:定义一个接口,IMyInterface&lt; T&gt;,然后创建我的控件

public partial class MyControl : UserControl, IMyInterface<SomeClass>

但是我失去了我的基本虚拟方法(不是很重要,但仍然......)。

有没有办法为UserControl创建基础泛型类,有可能在VisualStudio Designer中编辑它?

4 个答案:

答案 0 :(得分:35)

我们正在做同样的事情,我们首先通过专门化一个类并从专门的类派生出来。 使用示例中的代码,这意味着:

public partial class UserControl : UserControlDesignable 
{

...
}
public class UserControlDesignable : BaseUserControl<Someclass> { }

设计师有时仍然表现得很脆弱 - 但大部分时间都有效。

答案 1 :(得分:14)

您必须通过添加继承自通用基本表单的“常规”类来欺骗设计人员。 然后,您的可设计表单应该继承自此类。 因此,以下2个类定义位于同一文件中。您必须确保从通用基本用户控件继承的类是文件中的最后一个类。

public MyForm : EditableCustomerForm
{}

public EditableCustomerForm : GenericForm<Customer>
{}

设计人员将在遇到的代码文件中显示第一个类。

答案 2 :(得分:3)

这似乎是Visual Studio中的一个错误。

通过挖掘框架(实际上通过添加RootDesignerSerializer来自CodeDomSerializer的自定义类型并覆盖serialize方法),我能够证明VS Code Dom提供程序实际上是在解析泛型类错误,而不是将其视为泛型类,而是将其视为名为class<T>的常规类,Type.GetType()当然无法找到它。

我仍然在寻找解决方法,但同时可以使用上述解决方案。

有关于它的Microsoft.Connect错误报告,请在https://connect.microsoft.com/VisualStudio/feedback/details/797279/win-forms-designer-error-when-inheriting-from-a-generic-form

投票

答案 3 :(得分:0)

Visual Studio版本&gt; = VS2015.1

VS2015.1 开始,Windows窗体设计器显示具有通用基类的类,没有任何问题。因此,VS的新版本不再需要其他帖子中的解决方法,并且设计器中将显示以下类,没有任何问题:

public class SomeClassControl:GenericControl<SomeClass>
{
}

较旧版本的Visual Studio

对于旧版本的Visual Studio,请使用其他帖子中描述的解决方法:

public class SomeClassControl:SomeClassControlBase
{
}
public class SomeClassControlBase:GenericControl<SomeClass>{}