具有通用控件的UserControl - 在设计器

时间:2016-07-21 17:48:10

标签: c# winforms visual-studio generics user-controls

我有一个WinForm-UserControl,它具有控件的泛型类型。为了创建实例,我更改了Designer代码:

public class TimeBarForm<T> : where T : TimeBarPanel
{
    protected void InitializeComponent()
    {
        // ...
        this.m_timeBarPanel = (T)Activator.CreateInstance(typeof(T));
        // ...
    }
}

这在编译时工作正常,但在设计时它已经坏了。在TimeBarForm上:

Failed to parse method 'InitializeComponent'. The parser reported the following error 
'Type parameters are not suppported Parameter name: typeSymbol'. 
Please look in the Task List for potential errors.

派生类只显示空用户控件的默认设计器。

我也尝试在构造函数中传递类型,但VS抱怨我不应该触摸自动生成的代码(它不喜欢if条件)。我想要一个通用的UserControl,在那里我可以决定派生类型中抽象类/控件的特化,我仍然可以在基类中使用设计器。我愿意接受其他建议来解决这个问题,因为这可能不是最佳解决方案。我不习惯UserControl-design。

VS 2015 / .Net 4.6

1 个答案:

答案 0 :(得分:0)

我做了一些有点脏的解决方法,但我可以使用设计器作为基类和派生类。我删除了泛型,并通过调用构造函数替换了Activator类。当我完成基类的设计时,我就会对这一行进行修改。派生类调用构造函数来传递实例:

    public TimeBarForm(TimeBarPanel timeBarPanel)
    {
        this.m_timeBarPanel = timeBarPanel;
        InitializeComponent();
    }

为了使派生类的设计者满意,第二个构造函数提供了一个默认实例:

    public TimeBarForm()
    {
        this.m_timeBarPanel = new TimeBarPanel();
        InitializeComponent();
    }

不漂亮,但我可以忍受它。