【问题标题】:Generic base class for WinForm UserControlWinForm UserControl 的通用基类
【发布时间】:2009-03-24 14:18:38
【问题描述】:

我为 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>();
    }
}

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

我已经有一个解决方法:定义一个接口,IMyInterface,然后将我的控件创建为

public partial class MyControl : UserControl, IMyInterface<SomeClass>

但是我失去了我的基本虚拟方法(没什么大不了的,但仍然......)。

有没有办法为 UserControl 创建一个基类,并可以在 VisualStudio 设计器中对其进行编辑?

【问题讨论】:

  • 你不必放弃你的基本虚方法,包含实现类而不是从它继承。
  • VS 2015.1 开始,Windows 窗体设计器显示具有通用基类的类没有任何问题。 See example.

标签: c# .net winforms visual-studio-2008 windows-forms-designer


【解决方案1】:

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

public partial class UserControl : UserControlDesignable 
{

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

设计师有时仍然表现得有些古怪 - 但大部分时间它都有效。

【讨论】:

  • 虽然是一种解决方法,但请注意,这必须在一个额外的文件中,如果基础是抽象的并且使用自定义类型提供程序属性(如本网站其他帖子中所述),它将每节课都要上
  • 仍然是 VS2015 中唯一可行的解​​决方案。 MS没有添加本机支持... :-(
  • @TobiasKnauss 从 VS 2015.1 开始,Windows 窗体设计器显示具有通用基类的类没有任何问题。 See example.
【解决方案2】:

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

public MyForm : EditableCustomerForm
{}

public EditableCustomerForm : GenericForm<Customer>
{}

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

【讨论】:

  • 好主意,但请注意,由于必须先编译基类,然后设计人员才能使用它,这意味着对于 EditableCustomerForm 类的任何更改都必须重新构建以供设计人员使用影响,设计师也可能只在 MyForm 类上工作
【解决方案3】:

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

通过深入研究框架(实际上是通过添加 RootDesignerSerializer 和从 CodeDomSerializer 派生的自定义类型并覆盖 serialize 方法),我能够证明 VS Code Dom 提供程序实际上解析错误泛型类,而不是将其视为泛型类,而是将其视为名称为class&lt;T&gt; 的常规类,Type.GetType() 当然找不到。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-05
    • 2013-04-12
    • 1970-01-01
    相关资源
    最近更新 更多